This document is the preregistration for the Preferential Physics project on Lookit. Data collection is currently underway, but sample size has been set prior to data collection kickoff (50 participants reaching 12th session), and the vast majority of videos haven’t even been coded for looks, much less critical DVs calculated.

This document contains a brief orientation to the project, links to relevant other documentation, and a reproducible set of analyses that reads in a set of pilot data and attempts to set up the model comparisons we actually care about!

It functions as a preregistration in the sense that, the final dataset will be run through this analytic code to produce the visualizations and models shown here; any additional analyses added later can be treated as exploratory. Where we have ‘decision trees’ or some aspect of the analysis is conditional on features of the final dataset, we note this where we know about it and specify how we’ll make those decisions.

If you’d like to skip straight to the preregistration details, start at the Data Contents section.

Introduction

The idea is to use dense sampling of individual infants on Lookit to conduct a detailed assessment of understanding of several physical principles. How stable are individual components across sessions and how independent? What does partial knowledge look like at the individual level?

We are interested in infants’ preferential looking ratio to simple violations of:

  • Gravity: Completely unsupported objects should fall down immediately, rather than moving up, continuing in their current trajectory, or moving down at some delay.

  • Inertia: Objects should continue roughly in their current trajectory when gravity is not a factor, rather than stopping and starting or turning around.

  • Support: which of the following should fall (vs. stay put) after being placed?

    • An object placed mostly on the anchor

    • An object placed only slightly on the anchor

    • An object touching the side or bottom of the anchor

    • An object near the anchor but not touching it

Big picture

Why study individual behavior in more detail–what do we lose in studying groups of kids? We don’t know the extent to which a success means that a significant fraction of kids this age can do this task VS that all kids of this age can do this task to a significant degree. And even looking at the distribution of scores doesn’t clear this up, unless it’s an incredibly strong result (e.g. all kids get 9-10 of 10 questions right, or no kids get more than 6 out of 10). This matters for

  • understanding how abilities are related to each other: we can’t get nearly as much out of age-based progressions without knowing how the noise works—especially for results of the form “n-month-olds, but not m-month-olds, can do X”

  • understanding what partial knowledge & mechanisms of change in a domain look like: when kids “fail,” is that some kids making a correct prediction and some making an incorrect prediction? Or are they all failing to make any prediction and/or predicting at chance? When kids succeed but not at ceiling, are some getting one aspect and some another?

It may be that some kids don’t express nearly-universal knowledge on the dependent measures we collect. We can evaluate this explanation for noise and/or individual differences by studying the methods themselves, and kids’ behavior on them: e.g., can we predict the types of preferential looking responses we get from kids based on control tasks? How stable are those controls and task performance across sessions? (Especially interesting would be differences within kids in expression: kids may genuinely express knowledge at some times, but not others, due to attentional/emotional state changes.)

Especially in development, where we’re interested in the underpinnings of human cognition, the difference between “some babies use this type of information but others do something else” and “all babies have this type of information available to them, unless something’s wrong” matters a lot—this is exactly where we care about universality.

Experimental paradigm

Children complete 24 20-second preferential looking trials per session; families are encouraged to complete 15 sessions within 2 months. Parents complete a short mood survey and go through some instructions before the preferential looking portion. They’re asked to hold their children looking over their shoulders during this portion to avoid parental bias. Parents can end the study at any point and skip to the post-study survey.

Each trial begins with an object intro (video of Kim saying “Look, this is a …”) and demonstrating use of an object – e.g. biting into an apple, putting on hand lotion, drawing with a marker, eating with a spoon) that lasts about 5 seconds.

This is intended as an attention-getter to re-orient children towards the center, while in principle reinforcing that the object in question is not an agent and should be expected to follow normal physical laws.

Then, two events involving that object are shown simultaneously, one on the left and one on the right, looping for 24s (event videos range from about 2-5s). Events always show the same object, same camera angle, same background, with a difference only in the “outcome.” Event types are shown in the table below; each concept is presented 4-6 times, with 2-3 repetitions of each event type. Although events are short, they loop continuously for 20s. Realtime events are shown so that “expected” events are at natural speeds, and not potentially seen as violating physical principles due to happening too slowly.

Parents can pause individual trials. If they pause during the intro, they just start over upon restarting. If they pause during the test (up to one time per trial) they restart from the intro, but then the left and right test videos are switched for the test phase.

Trial assignment & ordering

(See below for descriptions of these trial types.) Trials cycle through gravity, inertia+calibration, support, and control (same/salience) pairings during a session; the order of these concepts is chosen from a list and changed (cycling through a list of orders) each session. There are six videos shown in each category in total.

Within each category, objects are assigned to comparison types (e.g. “apple” assigned to “table, down vs. up”) by choosing from a list of acceptable mappings, again incremented per session. (The first session value was selected randomly from the first six options initially [by accident], and is now selected from all possible mappings.)

There are six possible comparisons for the stay and fall events; three comparisons are assigned to stay and three to fall, with the selection again cycling through a random list of such assignments per session. Left/right placement, horizontal flipping of the left and right events, camera angles, and backgrounds are chosen randomly with the constraint that half of the ‘more probable’ events are on the left within each category. Calibration trials (grouped with inertia videos for purposes of assigning object intros) are placed at trials 3 and 6, so that they are always available for kids who completed enough trials for the session to be included (and so that if there are differences in coding quality across trials, we’re not excluding on the basis of when calibration happened).

Event types

Gravity

Table

Object is rolled/slid off a table and continues down, horizontal, or up.

Toss

Object in hand is tossed down, falls UP, tossed up, falls DOWN.

Ramp

Object is placed in center of ramp and released to roll down or up.

Inertia

Stop

Object rolls from one side of screen and stops in the middle, then re-starts on its own, or by a hand.

Reverse

Object rolls/slides from one side of the screen and collides with a barrier, or takes the same trajectory colliding against no bairrier.

Support

Fall

An object is placed (mostly on/slightly on/next to/near) on a cabinet and immediately falls.

Stay

An object is placed (mostly on/slightly on/next to/near) on a cabinet and stays there.

Control

Same

Distinguishable but similar physically-possible human actions on objects, like rotating an object about one axis vs. another

Salience

Physically-possible human actions on objects, some more interesting, like flipping a spoon vs. slowly extending it or erasing a drawing vs. an empty board.

Calibration

A spinning ball moves across the entire screen.

Dataset contents

Here we describe the information that will be available in the final dataset. Some of this info is not available for the pilot dataset, in particular anything having to do with more than one session.

Per child

  • Age at start

  • Demographic info (optional, typically reported): family income, languages spoken at home, parent education level(s), number of parents in the home, number of children’s books in the home, child’s race, number and age of siblings, country + US state if in US, urban/suburban/rural

Per session (Avaliable once video is hand-coded)

  • Child’s age

  • Number of previous sessions completed

  • Time since last session

  • Mood data (Before beginning study, by parent report. Scales 1-7: CHILD: tired-rested, sick-healthy, fussy-happy, calm-active; PARENT: tired-energetic, overwhelmed-ontopofthings, upset-happy. How long since child woke up, how long since child ate, how long until child is due for nap/sleep; what child was doing before this.)

Per trial

  • Time looking L, R (full time sequence of looks left, right, away)

  • Number of fixations (derived from the first one)

  • Proportion looking to L, out of time looking to screen (derived from the first one)

  • Parent behavior: times of talking, pointing, and peeking

  • Infant behavior: times of fussing & rating of fussiness level low or high

  • Trial number

Predictors for fraction time to left

  • Comparison type (e.g. ramp up vs. down), nested within

  • Event type (e.g. ramp), nested within…

  • Concept (gravity, inertia, support)

  • Object (apple, lotion bottle, scissors…)

  • Whether each side is unexpected (i.e., does the event on the left clearly violate a physical principle? Does the event on the right? Sometimes both are unexpected to adults, e.g. when an object near a cabinet and an object next-to a cabinet stay put; sometimes neither is. In some cases this depends on the child’s potential beliefs, see modeling…) & which side is less expected.

Sample size & recruitment procedures

Age range 4-12 months at start of study; continue for up to 61 days; target ‘complete’ dataset is 12 usable sessions. (No major age differences in data quality or salience/same controls seen in piloting.)

Plan to recruit as large a balanced sample as practical given time constraints on both testing and recruiting; aiming for 50 participants with a complete dataset. All recruitment decisions are / have been made without examining dependent variables. This will also be the case if we must terminate data collection early (i.e. for timing/funding constraints)

Data exclusion & disambiguation

All partial datasets (<12 sessions) and any extra data collected will be included in the analysis. Data will only be excluded from analysis if it meets any of the criteria below; we aim to include as much data as possible and use analyses that are robust to missing/‘unbalanced’ data. Data may be excluded at the level of the participant (i.e. all data from that child is excluded), sessions, or individual trial.

Note also that because (a) we may exclude some-but-not-all data from a participant and (b) the number of times baby is taken to have seen the study is relevant, the ‘study number’ (= number of sessions seen) may differ from a simple count of the sessions that are present in the dataset.

Child level

  • Gestational age at birth < 37 weeks, for any analyses using age. Unknown gestational age will be used but prevalence reported. (Followup to check that inclusion of premature infants does not qualitatively affect other results, and/or to display results from premature infants with adjusted/non-adjusted age - exploratory.)

  • Children who participated in the pilot study

  • Children whose parents spontaneously report developmental/medical issues that would likely explain some differences in task: vision or hearing impairment; cognitive or neurological disorders including due to trisomies.

  • Note again: We include data from children with any number of sessions (will probably have many with <12 in addition to “complete” data); analyses described should be able to handle this appropriately.

Session level

  • Sessions where children are outside age range of 4-14 months, except for binned-by-age analyses where we may display data from children outside the age range (without affecting any other values) if we end up having it. Adjusted age will be used for premature infants.

  • Sessions with < 6 trials (& don’t count as a session for session # purposes). Parents are encouraged not to complete sessions within 6 hours of each other. For each session (process later -> earlier), if another session with fewer completed trials happened within six hours, use this one instead.This leads to reasonable outcomes even in the unlikely event someone’s doing the study every 5 hours.

  • Require calibration performance >75% to use session. Calibration scores seem to be mostly due to difficulty coding and might therefore index overall confidence in other judgments; timing differences in webcam stream vs. displayed stimuli will also affect calibration. Pool all looking across the two calibration trials to compute an overall calibration score, so that if kids aren’t looking as much for one of the trials we don’t average in a much noisier measurement. Score is fractional looking time to correct side during the middle of periods when the ball should be static: [0.5, 3.5], [5.5, 8.5], [10.5, 13.5], [15.5, 18.5], [20.5, 23.5].

  • If the participant has <12 usable sessions spread over >60 days, use sessions from the earliest 60-day period (inclusive) with the most usable sessions. If the participant has >=12 usable sessions over >60 days, use sessions from the earliest 60-day period (inclusive) with at least 12 sessions.

  • Where absolute session number (as an index of how many times the child has seen stimuli, etc.) is relevant, assign the first session used in analysis a session number according to the number of ‘experienced sessions’ in the preceding 60 days. Experienced sessions include sessions where the child is out of age range or calibration performance is poor, but not sessions with <6 trials. (For instance, if a child participates at 4 months of age and then 12 times from 10-11 months, the latter set of data is used and the first session at 10 months is considered session 1. If a child participates on days 1, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, then sessions starting at day 30 are used but the first session number is 2.

Trial level

  • Require >= 2s looking to use a trial. Don’t otherwise deal with shorter/longer LTs except in (exploratory) model.

  • Omit periods where the child is out of frame or gaze is otherwise impossible to code. Treat as out of frame any periods where the video is ‘frozen’ for >1s (start treating as out of frame 1s after this period begins) and report prevalence.

  • Exclude trials where child is fussing >50% of the trial. In contrast to omitting periods where child is fussing, this avoids dependence on exactly which frames are considered fussy, at the cost of a threshold effect we expect not to affect many trials. >50% applies to length of video, not otherwise codable data (i.e. we allow fuss coding during outofframe periods).

  • Parent interference: Exclude periods of trials after parent peeks, points while peeking, or speaks in any way that could bias child (“what’s that ball doing?” but not “keep looking sweetie!”) Include periods where the parent’s eyes are not visible and we can’t tell where they’re looking (unless there is reason to believe they are looking) and periods where the parent is looking away but may see stimuli peripherally.

The Pilot Dataset

This is a pilot dataset, it consists of (cleaned, post-data exclusion, post trial-proportion calculations) a set of subjects who participated in one physics session that is similar to the sessions that are being run in the main data collection. The principle difference is that the pilot dataset has exactly 1 session per participant, and the conditions X and Y are absent.

QUESTION FOR KIM: Is it the case that all exclusion criteria have been applied in the pilot dataset? (In particular: criteria for calibration?)

  X                  shortId child.gender child.additionalInformation
1 1 57e4675fc0d9d70060c680ee         male                            
2 2 57e4a294c0d9d70061c68140       female                            
3 3 57e56dbdc0d9d70060c681f9       female                            
4 4 57e57274c0d9d70061c681ff         male                            
5 5 57e596f6c0d9d70060c68274       female                            
6 6 57e939a7c0d9d70060c68458       female                            
  ageRegistration ageExitsurvey withdrawn consent
1       12.756164     12.756164     FALSE     yes
2        4.832877      4.832877     FALSE     yes
3        8.679452      8.679452     FALSE     yes
4       10.915068     10.915068     FALSE     yes
5       11.408219     11.408219     FALSE     yes
6       11.769863     11.769863     FALSE     yes
                           consentnotes usable allcoders coderComments.Kim
1 child present, camera far from screen    yes ['Alice']                NA
2                      no child present    yes ['Alice']                NA
3                         child present    yes ['Alice']                NA
4                         child present    yes ['Alice']                NA
5                         child present    yes ['Alice']                NA
6                         child present    yes ['Alice']                NA
  coderComments.Jessica                            coderComments.Alice
1                                                      difficult angle
2                       a lot of squirming, blurry, suddenly dark once
3                                                                     
4                                                    a lot of bouncing
5                                                 parent keeps peeking
6                                              blurry, far from camera
  nVideosExpected nVideosFound expectedDuration actualDuration
1              25           25          477.778       477.7667
2              25           23          432.699       432.7000
3              25           23          396.937       396.9333
4              25           22          404.554       404.5667
5              25           25          462.382       462.3667
6              25           22          394.653       394.6333
  exit.survey.withdrawal exit.survey.useOfMedia exit.survey.databraryShare
1                  FALSE                private                        yes
2                  FALSE                private                        yes
3                  FALSE             scientific                        yes
4                  FALSE             scientific                        yes
5                  FALSE                private                        yes
6                  FALSE             scientific                        yes
  exit.survey.feedback mood.survey.active mood.survey.childHappy
1                                       7                      6
2                                       7                      7
3                                       7                      7
4                                       6                      4
5                                       7                      7
6                                       7                      7
  mood.survey.rested mood.survey.healthy   mood.survey.doingBefore
1                  6                   7           playing outside
2                  7                   7 Playing in her jungle gym
3                  6                   7             in her jumper
4                  3                   5           Nursing/Playing
5                  7                   7              taking a nap
6                  2                   7                   playing
  mood.survey.lastEat mood.survey.napWakeUp mood.survey.nextNap
1                  60                   210                  60
2                  60                    30                  85
3                  15                   120                  NA
4                   5                   126                  NA
5                  15                    60                 180
6                 120                   150                  NA
  mood.survey.usualNapSchedule mood.survey.ontopofstuff
1                          yes                        4
2                          yes                        4
3                           no                        7
4                           no                        7
5                          yes                        7
6                           no                        7
  mood.survey.parentHappy mood.survey.energetic child.ageAtBirth
1                       6                     3 40 or more weeks
2                       4                     4         37 weeks
3                       7                     2         37 weeks
4                       7                     5         38 weeks
5                       6                     7         39 weeks
6                       7                     2 40 or more weeks
  codedby_Alice codedby_Jessica use_coder has_preview videonum calibration
1          TRUE           FALSE     Alice       FALSE        1   0.9320944
2          TRUE           FALSE     Alice       FALSE        1          NA
3          TRUE           FALSE     Alice       FALSE        1   0.8694853
4          TRUE           FALSE     Alice       FALSE        1   0.9836244
5          TRUE           FALSE     Alice       FALSE        1          NA
6          TRUE           FALSE     Alice       FALSE        1   1.0000000
  duration  left ooftime right                         stimuli trialnum
1    17000  7053       0  7208                     calibration        1
2    17000  1721       0   668 sbs_ramp_up_down_apple_c1_b1_RR        1
3    17000  6532       0 10468                     calibration        1
4    17000  6901       0  9466                     calibration        1
5    17000 13600       0  1367    sbs_same_B_A_funnel_c1_b1_NN        1
6    17000  6733       0 10267                     calibration        1
        event concept object unexpectedLeft unexpectedRight lessExpectedLeft
1 calibration    <NA>   <NA>             NA              NA               NA
2        ramp gravity  apple           TRUE           FALSE             TRUE
3 calibration    <NA>   <NA>             NA              NA               NA
4 calibration    <NA>   <NA>             NA              NA               NA
5        same control funnel          FALSE           FALSE               NA
6 calibration    <NA>   <NA>             NA              NA               NA
  outcomeLeft outcomeRight comparison  fracLeft fracLessExpected   fracAbs
1        <NA>         <NA>       <NA> 0.4945656               NA 0.5054344
2          up         down    down:up 0.7203851        0.7203851 0.7203851
3        <NA>         <NA>       <NA> 0.3842353               NA 0.6157647
4        <NA>         <NA>       <NA> 0.4216411               NA 0.5783589
5           B            A        A:B 0.9086657               NA 0.9086657
6        <NA>         <NA>       <NA> 0.3960588               NA 0.6039412
     metric totalLT child.proquint
1 0.9320944  14.261    vuton-jikut
2 0.7203851   2.389    zobuh-kitob
3 0.8694853  17.000    lovol-juhan
4 0.9836244  16.367    duliz-zuriz
5 0.9086657  14.967    fadot-kopuh
6 1.0000000  17.000    buzus-sijif

As a warmup, we’ll begin by visualizing the pilot dataset for some basic properties. First, we expect that babies’ total looking time will drop over time (i.e. later trials have shorter looking times).

Next, we’ll begin plot the critical DV - how much time do babies spend looking at surprising things? Note a complication of the dataset here: we will be modeling the ‘raw’ dependent variable, fracLeft (that is, out of some amount of time staring at the screen, what percentage of that time is spent looking at the left-hand video?). Then in general, we’ll be asking whether this proportion is affected by lessExpectedLeft - is whichever video is most surprising (from an adult point of view) located on the left or the right?

Remember that lessExpectedLeft corresponds to a different video/video pair type for every event and concept. Critically, this value is undefined for some event types, in particular the SAME events.

First, a histogram of distributions:

This resembles a symmetric beta distribution with a ‘bump’ in the middle (or a mixture of multiple parameter settings?. This is actually sensible, because it includes counterbalancing of all ‘surprisal’ events, and because the above contains cases where babies may usually look about equally at both sides (e.g. the SAME condition), and cases where some (but not all!) babies will consistently look more at one video or the other. To test this, let’s try faceting out by event.

Plot again without calibration event so we can see more clearly:

Build the basic model

Let’s assume that we’re dealing with beta distributions. Time to build up the model! We’ll use the glmmTMB package.

QUESTION FOR PATRICK: Any reason/limitation of this package to be aware of?

First, set up the family of distributions we’ll be using:

 Family: beta  ( logit )
Formula:          fracLeft_tr ~ 1
Data: pilotdata

     AIC      BIC   logLik deviance df.resid 
   -92.5    -82.9     48.3    -96.5      896 


Overdispersion parameter for beta family (): 1.41 

Conditional model:
            Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.04614    0.04002  -1.153    0.249

Shared random/fixed effects

Our goal here is to deal with the ‘boring’ fixed & random effects structure that should be the starting point for all subsequent models. That is, we want to capture the structure of the task is a sensible way, so we can test hypotheses on top of it.

Some reminders:

shortID - the participant stimuli - the individual stimulus

We aim for conclusions to generalize over both individual children & stimuli, so treat both as random factors.

 Family: beta  ( logit )
Formula:          fracLeft_tr ~ 1 + (1 | shortId) + (1 | stimuli)
Data: pilotdata

     AIC      BIC   logLik deviance df.resid 
  -335.9   -316.7    171.9   -343.9      894 

Random effects:

Conditional model:
 Groups  Name        Variance Std.Dev.
 shortId (Intercept) 0.4681   0.6842  
 stimuli (Intercept) 0.4287   0.6548  
Number of obs: 898, groups:  shortId, 43; stimuli, 408

Overdispersion parameter for beta family (): 2.66 

Conditional model:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -0.0689     0.1172  -0.588    0.557

(Fitting just intercepts for now)

QUESTION FOR PATRICK: APPROPRIATE SLOPES? The standard advice I’ve recieved is to include maximal slopes for all random effects, but if I’m going to be building up the fixed effects as I go, I’m not sure what the right order of operations is here.

Some ‘boring’ fixed effects that are relevant for all items:

ageRegistration - the age of the child trialnum - The trial number

Both of these may matter on their own (in general, looking times curves could change with age, or with time going through the experiment), and may also interact (older children might get bored faster, for instance.)

 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ ageRegistration * trialnum + (1 | shortId) + (1 |  
    stimuli)
Data: pilotdata

     AIC      BIC   logLik deviance df.resid 
  -333.3   -299.7    173.7   -347.3      891 

Random effects:

Conditional model:
 Groups  Name        Variance Std.Dev.
 shortId (Intercept) 0.4474   0.6689  
 stimuli (Intercept) 0.4259   0.6526  
Number of obs: 898, groups:  shortId, 43; stimuli, 408

Overdispersion parameter for beta family (): 2.66 

Conditional model:
                          Estimate Std. Error z value Pr(>|z|)
(Intercept)               0.146779   0.379976   0.386    0.699
ageRegistration          -0.022785   0.041257  -0.552    0.581
trialnum                  0.017517   0.016594   1.056    0.291
ageRegistration:trialnum -0.002235   0.001843  -1.212    0.225

QUESTION FOR PATRICK:

  1. Should I be deciding at this stage whether to drop any of these factors? Or specifying a decision rule that I’ll use to determine how to treat the eventual dataset?

  2. Many ‘value out of range in ’lgamma’’ messages generated. When are these problematic vs. not? Sometimes sensible-looking summaries are generated, can I trust them?

  3. NOTE: In the full dataset, we’d also want to include a term for session number (how many sessions this child has seen.) This will be very highly correlated with age, since they both unfold over time. What to do about this?

More complex models of the task itself may be appropriate (especially for the ‘Looking Personalities’ analyses), but we aim to select just one model to use for building up the physics models. Once we settle on this ‘task model’, we can proceed to work on adding factors for modeling the questions we’re interested in!

  1. Beta distribution family has two parameters. How are those parameters ‘allowed’ to vary if ageRegistation is included as a single term as above? Ideally, I’d like to be able to capture age trends like “as AgeRegistration rises, the mean moves away from 0.5”.

5)Is there a good way to save the model we select here as a variable so it can be referenced in subsequent models below? It’s possible that a slightly different model will be warranted in the final dataset than this pilot dataset (we’ll need to preregister a decision rule here.)

Physics predictor

The primary predictor we are interested in is whether children look longer (or at least a non-chance fraction!) at unexpected events (lessExpectedLeft). To complicate things, this value is undefined for two event types (same, calibration). We’ll leave those out for now (they are used only for the ‘looking personality’ results.)

For the questions about infants’ knowledge of phyics, we’ll limit ourselves to this question about unexpectedness! To model this, we simply add a term to the model:

 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ lessExpectedLeft * ageRegistration * trialnum +  
    (1 | shortId) + (1 | stimuli)
Data: physics_events

     AIC      BIC   logLik deviance df.resid 
  -237.4   -189.1    129.7   -259.4      584 

Random effects:

Conditional model:
 Groups  Name        Variance Std.Dev.
 shortId (Intercept) 0.5255   0.7249  
 stimuli (Intercept) 0.2879   0.5365  
Number of obs: 595, groups:  shortId, 43; stimuli, 363

Overdispersion parameter for beta family ():  2.3 

Conditional model:
                                               Estimate Std. Error z value
(Intercept)                                    1.269287   0.543342   2.336
lessExpectedLeftTRUE                          -1.914727   0.609890  -3.139
ageRegistration                               -0.115478   0.058335  -1.980
trialnum                                      -0.065141   0.029651  -2.197
lessExpectedLeftTRUE:ageRegistration           0.164995   0.066091   2.497
lessExpectedLeftTRUE:trialnum                  0.123222   0.043591   2.827
ageRegistration:trialnum                       0.005095   0.003257   1.564
lessExpectedLeftTRUE:ageRegistration:trialnum -0.010928   0.004829  -2.263
                                              Pr(>|z|)   
(Intercept)                                    0.01949 * 
lessExpectedLeftTRUE                           0.00169 **
ageRegistration                                0.04775 * 
trialnum                                       0.02802 * 
lessExpectedLeftTRUE:ageRegistration           0.01254 * 
lessExpectedLeftTRUE:trialnum                  0.00470 **
ageRegistration:trialnum                       0.11769   
lessExpectedLeftTRUE:ageRegistration:trialnum  0.02364 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

NOTE: In the pilot dataset, this actually makes the overall AIC/BIC get worse; this is relatively unsurprising since many of these comparisons yield a finding (when graphed) that children do not seem to be affected by surprisingness! It would also not be terribly shocking to find in the real dataset, since lumping all the event types and ages together is not appropriate.

QUESTION FOR PATRICK: I am used to comparing models with anova(model1, model2), but wonder if there is a better choice. I would like to be able to express confidence that including the term is warranted (e.g. ‘surprisingness matters’). This could be p-values or something else, but would strongly prefer to be using only one (family of) hypothesis-testing metric.

Event-general models & hypotheses

To get actually interpretable models that we can test, first take each event type (Ramp, Fall, Stay, etc.) individually, and (a) ask whether the interaction between surprisingness and age is significant overall for that subset (i.e. repeat the ‘task model’ for each event type, as though they were independent experiments), (b) ask whether there is a significant difference from chance at 12mo, and (c) Display age trends.

QUESTION FOR KIM: You wrote “Could also do mean fLT ~ age + comparisonType + (1|child) or similar, except for concerns about differing correlations among subsets of comparison types.” This is what I did (since both are identical for the single-session version), but can you say more about this?

So, we’ll first set up the common plan, and then execute each!

Salience

(This is the template model for all other individual events; just including Salience here for space; analyses will be parallel.)

value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'NA/NaN function evaluation
 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ lessExpectedLeft * ageRegistration * trialnum +  
    (1 | shortId) + (1 | stimuli)
Data: salience

     AIC      BIC   logLik deviance df.resid 
   -49.2    -19.3     35.6    -71.2      101 

Random effects:

Conditional model:
 Groups  Name        Variance Std.Dev.
 shortId (Intercept) 0.4320   0.6573  
 stimuli (Intercept) 0.2257   0.4751  
Number of obs: 112, groups:  shortId, 42; stimuli, 42

Overdispersion parameter for beta family (): 2.13 

Conditional model:
                                               Estimate Std. Error z value
(Intercept)                                    0.151404   1.167804   0.130
lessExpectedLeftTRUE                           0.588075   1.678450   0.350
ageRegistration                               -0.089734   0.132795  -0.676
trialnum                                       0.018459   0.076027   0.243
lessExpectedLeftTRUE:ageRegistration           0.059473   0.181586   0.328
lessExpectedLeftTRUE:trialnum                  0.007601   0.119475   0.064
ageRegistration:trialnum                      -0.001128   0.008590  -0.131
lessExpectedLeftTRUE:ageRegistration:trialnum -0.001236   0.013044  -0.095
                                              Pr(>|z|)
(Intercept)                                      0.897
lessExpectedLeftTRUE                             0.726
ageRegistration                                  0.499
trialnum                                         0.808
lessExpectedLeftTRUE:ageRegistration             0.743
lessExpectedLeftTRUE:trialnum                    0.949
ageRegistration:trialnum                         0.896
lessExpectedLeftTRUE:ageRegistration:trialnum    0.924

Event-specific models and hypotheses

After predicting whether children become more sensitive to (adult-defined) surprising versions > less surprising versions of each event type, we will ask some further questions that are specific to each domain, and also attempt to discover whether the theoretical clusterings (of comparisons into events, and events into concepts) actually reflect individual childrens’ performances.

For all of these, we’ll start with ‘surprisingness’ model above, and ask whether various additions of the ‘comparison’ factor improve fit.

Gravity

Table

Gravity, graded judgment: predict table up v down > down v continue > up v continue. Is each pairwise comparison significant?

Method: Filter to each pairwise comparison, ask whether including the comparison type (e.g. up/down vs up/continue) improves model fit.

TABLE event doesn’t exist in the pilot set, so try this with two examples from the ‘fall’ event instead:

Model convergence problem; non-positive-definite Hessian matrix. See vignette('troubleshooting')NaNs produced
 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ lessExpectedLeft * ageRegistration * trialnum +  
    (1 | shortId) + (1 | stimuli)
Data: fall_mo_vs_near

     AIC      BIC   logLik deviance df.resid 
      NA       NA       NA       NA        2 

Random effects:

Conditional model:
 Groups  Name        Variance  Std.Dev. 
 shortId (Intercept) 7.677e+00 2.771e+00
 stimuli (Intercept) 6.989e-11 8.360e-06
Number of obs: 13, groups:  shortId, 7; stimuli, 11

Overdispersion parameter for beta family (): 1.08e+03 

Conditional model:
                                               Estimate Std. Error z value
(Intercept)                                    9.307063   3.451196   2.697
lessExpectedLeftTRUE                          -0.109486         NA      NA
ageRegistration                               -0.957806   0.351433  -2.725
trialnum                                      -0.695669   0.090908  -7.652
lessExpectedLeftTRUE:ageRegistration          -1.255866         NA      NA
lessExpectedLeftTRUE:trialnum                  0.622998         NA      NA
ageRegistration:trialnum                       0.060190   0.007336   8.204
lessExpectedLeftTRUE:ageRegistration:trialnum  0.018815         NA      NA
                                              Pr(>|z|)    
(Intercept)                                    0.00700 ** 
lessExpectedLeftTRUE                                NA    
ageRegistration                                0.00642 ** 
trialnum                                      1.97e-14 ***
lessExpectedLeftTRUE:ageRegistration                NA    
lessExpectedLeftTRUE:trialnum                       NA    
ageRegistration:trialnum                      2.32e-16 ***
lessExpectedLeftTRUE:ageRegistration:trialnum       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
NA/NaN function evaluationModel convergence problem; non-positive-definite Hessian matrix. See vignette('troubleshooting')Model convergence problem; false convergence (8). See vignette('troubleshooting')
 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ comparison * lessExpectedLeft * ageRegistration *  
    trialnum + (1 | shortId) + (1 | stimuli)
Data: fall_mo_vs_near

     AIC      BIC   logLik deviance df.resid 
      NA       NA       NA       NA       -6 

Random effects:

Conditional model:
 Groups  Name        Variance  Std.Dev. 
 shortId (Intercept) 1.490e+01 3.859e+00
 stimuli (Intercept) 2.301e-13 4.797e-07
Number of obs: 13, groups:  shortId, 7; stimuli, 11

Overdispersion parameter for beta family (): 2.12e+11 

Conditional model:
                                                                              Estimate
(Intercept)                                                                   34.41331
comparisonmostly-on:slightly-on                                               -0.06905
lessExpectedLeftTRUE                                                          -0.06412
ageRegistration                                                               -4.45788
trialnum                                                                      -2.17283
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE                          -0.06412
comparisonmostly-on:slightly-on:ageRegistration                                1.14075
lessExpectedLeftTRUE:ageRegistration                                          -1.12009
comparisonmostly-on:slightly-on:trialnum                                      -0.99083
lessExpectedLeftTRUE:trialnum                                                  1.00068
ageRegistration:trialnum                                                       0.26850
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration          -1.12009
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:trialnum                  1.00068
comparisonmostly-on:slightly-on:ageRegistration:trialnum                       0.03565
lessExpectedLeftTRUE:ageRegistration:trialnum                                 -0.03737
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration:trialnum -0.03737
                                                                              Std. Error
(Intercept)                                                                           NA
comparisonmostly-on:slightly-on                                                       NA
lessExpectedLeftTRUE                                                                  NA
ageRegistration                                                                       NA
trialnum                                                                              NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE                                  NA
comparisonmostly-on:slightly-on:ageRegistration                                       NA
lessExpectedLeftTRUE:ageRegistration                                                  NA
comparisonmostly-on:slightly-on:trialnum                                              NA
lessExpectedLeftTRUE:trialnum                                                         NA
ageRegistration:trialnum                                                              NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration                  NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:trialnum                         NA
comparisonmostly-on:slightly-on:ageRegistration:trialnum                              NA
lessExpectedLeftTRUE:ageRegistration:trialnum                                         NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration:trialnum         NA
                                                                              z value
(Intercept)                                                                        NA
comparisonmostly-on:slightly-on                                                    NA
lessExpectedLeftTRUE                                                               NA
ageRegistration                                                                    NA
trialnum                                                                           NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE                               NA
comparisonmostly-on:slightly-on:ageRegistration                                    NA
lessExpectedLeftTRUE:ageRegistration                                               NA
comparisonmostly-on:slightly-on:trialnum                                           NA
lessExpectedLeftTRUE:trialnum                                                      NA
ageRegistration:trialnum                                                           NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration               NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:trialnum                      NA
comparisonmostly-on:slightly-on:ageRegistration:trialnum                           NA
lessExpectedLeftTRUE:ageRegistration:trialnum                                      NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration:trialnum      NA
                                                                              Pr(>|z|)
(Intercept)                                                                         NA
comparisonmostly-on:slightly-on                                                     NA
lessExpectedLeftTRUE                                                                NA
ageRegistration                                                                     NA
trialnum                                                                            NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE                                NA
comparisonmostly-on:slightly-on:ageRegistration                                     NA
lessExpectedLeftTRUE:ageRegistration                                                NA
comparisonmostly-on:slightly-on:trialnum                                            NA
lessExpectedLeftTRUE:trialnum                                                       NA
ageRegistration:trialnum                                                            NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration                NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:trialnum                       NA
comparisonmostly-on:slightly-on:ageRegistration:trialnum                            NA
lessExpectedLeftTRUE:ageRegistration:trialnum                                       NA
comparisonmostly-on:slightly-on:lessExpectedLeftTRUE:ageRegistration:trialnum       NA

QUESTION FOR PATRICK: These models don’t converge, and I’m not sure the correct procedure for proceeding in this case!

Toss, Ramp

(No within-event tests)

Inertia

Stop, Reverse

(No within-event tests)

Support

Stay/Fall

QUESTION FOR PATRICK (this whole section)

Comparisons are theoretically paired across the stay/fall distinction. Specifically, we expect each comparison to anticorrelate across the stay/fall distinction. Additionally, we expect that different comparisons should ‘come online’ at different points.

The goal here is to define a model that can support asking these questions. My best guess at this model would be:

fitbeta_support_comparisons <- glmmTMB(fracLeft_tr ~ ageRegistration*lessExpectedLeft*event*comparison + ageRegistration*trialnum + (1|shortId) + (1|stimuli), data = support, family = beta_family(link = "logit"))
value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'value out of range in 'lgamma'Model convergence problem; non-positive-definite Hessian matrix. See vignette('troubleshooting')
summary(fitbeta_support_comparisons)
 Family: beta  ( logit )
Formula:          
fracLeft_tr ~ ageRegistration * lessExpectedLeft * event * comparison +  
    ageRegistration * trialnum + (1 | shortId) + (1 | stimuli)
Data: support

     AIC      BIC   logLik deviance df.resid 
      NA       NA       NA       NA      209 

Random effects:

Conditional model:
 Groups  Name        Variance Std.Dev.
 shortId (Intercept) 0.62972  0.7935  
 stimuli (Intercept) 0.01833  0.1354  
Number of obs: 262, groups:  shortId, 43; stimuli, 193

Overdispersion parameter for beta family ():  2.8 

Conditional model:
                                                                                 Estimate
(Intercept)                                                                    -1.451e+00
ageRegistration                                                                 8.992e-02
lessExpectedLeftTRUE                                                            2.294e+01
eventstay                                                                       3.123e+00
comparisonmostly-on:next-to                                                     2.295e+00
comparisonmostly-on:slightly-on                                                 9.078e-02
comparisonnear:next-to                                                          1.851e+00
comparisonnear:slightly-on                                                     -1.434e+02
comparisonnext-to:slightly-on                                                   1.135e+01
trialnum                                                                        1.674e-02
ageRegistration:lessExpectedLeftTRUE                                           -1.843e+00
ageRegistration:eventstay                                                      -1.841e-01
lessExpectedLeftTRUE:eventstay                                                 -2.502e+01
ageRegistration:comparisonmostly-on:next-to                                    -2.348e-01
ageRegistration:comparisonmostly-on:slightly-on                                -2.904e-02
ageRegistration:comparisonnear:next-to                                         -1.934e-01
ageRegistration:comparisonnear:slightly-on                                      1.151e+01
ageRegistration:comparisonnext-to:slightly-on                                  -9.557e-01
lessExpectedLeftTRUE:comparisonmostly-on:next-to                               -2.215e+01
lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                           -2.022e+01
lessExpectedLeftTRUE:comparisonnear:next-to                                    -2.132e+01
lessExpectedLeftTRUE:comparisonnear:slightly-on                                 1.247e+02
lessExpectedLeftTRUE:comparisonnext-to:slightly-on                             -3.429e+01
eventstay:comparisonmostly-on:next-to                                          -4.119e+00
eventstay:comparisonmostly-on:slightly-on                                      -4.276e+00
eventstay:comparisonnear:next-to                                               -2.802e+00
eventstay:comparisonnear:slightly-on                                            1.428e+02
eventstay:comparisonnext-to:slightly-on                                        -1.169e+01
ageRegistration:trialnum                                                       -3.518e-03
ageRegistration:lessExpectedLeftTRUE:eventstay                                  1.958e+00
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:next-to                1.855e+00
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:slightly-on            1.573e+00
ageRegistration:lessExpectedLeftTRUE:comparisonnear:next-to                     1.751e+00
ageRegistration:lessExpectedLeftTRUE:comparisonnear:slightly-on                -1.003e+01
ageRegistration:lessExpectedLeftTRUE:comparisonnext-to:slightly-on              2.866e+00
ageRegistration:eventstay:comparisonmostly-on:next-to                           3.745e-01
ageRegistration:eventstay:comparisonmostly-on:slightly-on                       3.696e-01
ageRegistration:eventstay:comparisonnear:next-to                                2.599e-01
ageRegistration:eventstay:comparisonnear:slightly-on                           -1.157e+01
ageRegistration:eventstay:comparisonnext-to:slightly-on                         9.426e-01
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to                      2.296e+01
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on                  2.560e+01
lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                           2.269e+01
lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on                      -1.268e+02
lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on                    3.433e+01
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to     -1.854e+00
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on -2.038e+00
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:next-to          -1.875e+00
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on       1.037e+01
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on   -2.791e+00
                                                                               Std. Error
(Intercept)                                                                            NA
ageRegistration                                                                        NA
lessExpectedLeftTRUE                                                                   NA
eventstay                                                                              NA
comparisonmostly-on:next-to                                                            NA
comparisonmostly-on:slightly-on                                                        NA
comparisonnear:next-to                                                                 NA
comparisonnear:slightly-on                                                             NA
comparisonnext-to:slightly-on                                                          NA
trialnum                                                                               NA
ageRegistration:lessExpectedLeftTRUE                                                   NA
ageRegistration:eventstay                                                              NA
lessExpectedLeftTRUE:eventstay                                                         NA
ageRegistration:comparisonmostly-on:next-to                                            NA
ageRegistration:comparisonmostly-on:slightly-on                                        NA
ageRegistration:comparisonnear:next-to                                                 NA
ageRegistration:comparisonnear:slightly-on                                             NA
ageRegistration:comparisonnext-to:slightly-on                                          NA
lessExpectedLeftTRUE:comparisonmostly-on:next-to                                       NA
lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                                   NA
lessExpectedLeftTRUE:comparisonnear:next-to                                            NA
lessExpectedLeftTRUE:comparisonnear:slightly-on                                        NA
lessExpectedLeftTRUE:comparisonnext-to:slightly-on                                     NA
eventstay:comparisonmostly-on:next-to                                                  NA
eventstay:comparisonmostly-on:slightly-on                                              NA
eventstay:comparisonnear:next-to                                                       NA
eventstay:comparisonnear:slightly-on                                                   NA
eventstay:comparisonnext-to:slightly-on                                                NA
ageRegistration:trialnum                                                               NA
ageRegistration:lessExpectedLeftTRUE:eventstay                                         NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:next-to                       NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                   NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:next-to                            NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:slightly-on                        NA
ageRegistration:lessExpectedLeftTRUE:comparisonnext-to:slightly-on                     NA
ageRegistration:eventstay:comparisonmostly-on:next-to                                  NA
ageRegistration:eventstay:comparisonmostly-on:slightly-on                              NA
ageRegistration:eventstay:comparisonnear:next-to                                       NA
ageRegistration:eventstay:comparisonnear:slightly-on                                   NA
ageRegistration:eventstay:comparisonnext-to:slightly-on                                NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to                             NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on                         NA
lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                                  NA
lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on                              NA
lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on                           NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to             NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on         NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                  NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on              NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on           NA
                                                                               z value
(Intercept)                                                                         NA
ageRegistration                                                                     NA
lessExpectedLeftTRUE                                                                NA
eventstay                                                                           NA
comparisonmostly-on:next-to                                                         NA
comparisonmostly-on:slightly-on                                                     NA
comparisonnear:next-to                                                              NA
comparisonnear:slightly-on                                                          NA
comparisonnext-to:slightly-on                                                       NA
trialnum                                                                            NA
ageRegistration:lessExpectedLeftTRUE                                                NA
ageRegistration:eventstay                                                           NA
lessExpectedLeftTRUE:eventstay                                                      NA
ageRegistration:comparisonmostly-on:next-to                                         NA
ageRegistration:comparisonmostly-on:slightly-on                                     NA
ageRegistration:comparisonnear:next-to                                              NA
ageRegistration:comparisonnear:slightly-on                                          NA
ageRegistration:comparisonnext-to:slightly-on                                       NA
lessExpectedLeftTRUE:comparisonmostly-on:next-to                                    NA
lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                                NA
lessExpectedLeftTRUE:comparisonnear:next-to                                         NA
lessExpectedLeftTRUE:comparisonnear:slightly-on                                     NA
lessExpectedLeftTRUE:comparisonnext-to:slightly-on                                  NA
eventstay:comparisonmostly-on:next-to                                               NA
eventstay:comparisonmostly-on:slightly-on                                           NA
eventstay:comparisonnear:next-to                                                    NA
eventstay:comparisonnear:slightly-on                                                NA
eventstay:comparisonnext-to:slightly-on                                             NA
ageRegistration:trialnum                                                            NA
ageRegistration:lessExpectedLeftTRUE:eventstay                                      NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:next-to                    NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:next-to                         NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:slightly-on                     NA
ageRegistration:lessExpectedLeftTRUE:comparisonnext-to:slightly-on                  NA
ageRegistration:eventstay:comparisonmostly-on:next-to                               NA
ageRegistration:eventstay:comparisonmostly-on:slightly-on                           NA
ageRegistration:eventstay:comparisonnear:next-to                                    NA
ageRegistration:eventstay:comparisonnear:slightly-on                                NA
ageRegistration:eventstay:comparisonnext-to:slightly-on                             NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to                          NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on                      NA
lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                               NA
lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on                           NA
lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on                        NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to          NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on      NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:next-to               NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on           NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on        NA
                                                                               Pr(>|z|)
(Intercept)                                                                          NA
ageRegistration                                                                      NA
lessExpectedLeftTRUE                                                                 NA
eventstay                                                                            NA
comparisonmostly-on:next-to                                                          NA
comparisonmostly-on:slightly-on                                                      NA
comparisonnear:next-to                                                               NA
comparisonnear:slightly-on                                                           NA
comparisonnext-to:slightly-on                                                        NA
trialnum                                                                             NA
ageRegistration:lessExpectedLeftTRUE                                                 NA
ageRegistration:eventstay                                                            NA
lessExpectedLeftTRUE:eventstay                                                       NA
ageRegistration:comparisonmostly-on:next-to                                          NA
ageRegistration:comparisonmostly-on:slightly-on                                      NA
ageRegistration:comparisonnear:next-to                                               NA
ageRegistration:comparisonnear:slightly-on                                           NA
ageRegistration:comparisonnext-to:slightly-on                                        NA
lessExpectedLeftTRUE:comparisonmostly-on:next-to                                     NA
lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                                 NA
lessExpectedLeftTRUE:comparisonnear:next-to                                          NA
lessExpectedLeftTRUE:comparisonnear:slightly-on                                      NA
lessExpectedLeftTRUE:comparisonnext-to:slightly-on                                   NA
eventstay:comparisonmostly-on:next-to                                                NA
eventstay:comparisonmostly-on:slightly-on                                            NA
eventstay:comparisonnear:next-to                                                     NA
eventstay:comparisonnear:slightly-on                                                 NA
eventstay:comparisonnext-to:slightly-on                                              NA
ageRegistration:trialnum                                                             NA
ageRegistration:lessExpectedLeftTRUE:eventstay                                       NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:next-to                     NA
ageRegistration:lessExpectedLeftTRUE:comparisonmostly-on:slightly-on                 NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:next-to                          NA
ageRegistration:lessExpectedLeftTRUE:comparisonnear:slightly-on                      NA
ageRegistration:lessExpectedLeftTRUE:comparisonnext-to:slightly-on                   NA
ageRegistration:eventstay:comparisonmostly-on:next-to                                NA
ageRegistration:eventstay:comparisonmostly-on:slightly-on                            NA
ageRegistration:eventstay:comparisonnear:next-to                                     NA
ageRegistration:eventstay:comparisonnear:slightly-on                                 NA
ageRegistration:eventstay:comparisonnext-to:slightly-on                              NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to                           NA
lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on                       NA
lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                                NA
lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on                            NA
lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on                         NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:next-to           NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonmostly-on:slightly-on       NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:next-to                NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnear:slightly-on            NA
ageRegistration:lessExpectedLeftTRUE:eventstay:comparisonnext-to:slightly-on         NA

Once specified, we’d like to ask the following questions:

  • Is it the case that predictions for STAY events ‘anti correlate’ with FALL events?

  • Intuitive approximate magnitude ordering based on adult understanding of physics: mostly-near, mostly-next, mostly-slightly, slightly-near, slightly-next, next-near. What orders do we actually see w/i kids?

QUESTION: FOR PATRICK: I’d like to be able to specify a planned comparison of these orderings, but I’m not sure how! (IE if I’d like to compare the model fits to something like “means are at [1 1 1 0.5 0.5 0.5]”, I don’t know how to implement that prediction.)

HYPOTHESIS SUGGESTIONS FROM KIM: Stage theory: Might make crude predictions based on which should stay vs. fall—if only mostly-on should stay put, then mostly-slightly, mostly-next, mostly-near are bigger differences and might show bigger preferences than the others, since in these cases we have one “expected” and one “unexpected” outcome. If mostly-on and slightly-on both stay put, then expect instead mostly-next, mostly-near, slightly-next, slightly-near to show bigger preferences than the others. Etc. Project preference vectors onto [1,1,1,0,0,0], [0,1,1,0,1,1], [0,0,0,1,1,1] and plot transformed coords by age, where transformed coords basically represent “how much like a partial-support-knower do you act,” “how much like an any-support-from-below-knower do you act,” “how much like an any-contact-is-support-knower do you act.” Overall, across kids, what preference vectors do we see, binned by age group? (plot mean vectors over time?) Could imagine getting closer to [1,1,1,0,0,0] as above or getting better on everything, even the ones that aren’t disparate on possibility (i.e. might expect a baby who “really gets it” to not care about something staying in midair vs. staying when placed next to a cabinet, because they’re both obviously impossible; OR might expect a baby who “really gets it” to differentiate even this subtle difference in probability because hey, maybe it’s a sticky table or my perception is noisy or something. Nothing in Baillargeon stage theory predicts getting better at this comparison with age, so it’s a nice test.

‘Looking personalities’

Separate from the question about physics, we can use the ‘control’ events to ask about the dynamics of looking time in these experiments. For these, we’ll return to the main dataset and split off the control events:

controldata <- pilotdata %>%
  filter(event == "same"|event == "calibration"|event="salience")
Error: unexpected '=' in:
"controldata <- pilotdata %>%
  filter(event == "same"|event == "calibration"|event="

Then, we’ll calculate a series of per-child/per-session measures:

Side bias: fractional looking time to R during ‘same’ events (3 events/session)

sidebias <- controldata %>%
  filter(event == "same")%>%
  group_by(shortId)%>%
  dplyr::summarize(sidebias = 1-mean(fracLeft_tr))
sidebias = merge(sidebias, subjlevel, by=shortId)
Error in fix.by(by.x, x) : object 'shortId' not found

Stickiness: |fLT – 0.5| during ‘same’ events (3 events/session)

Sensitivity: fLT to more interesting during ‘salience’ events (3 events/session)

# sensitivity <- controldata %>%
#   filter(event == "salience")%>%
#   mutate(fracLessExpected_tr)
#   group_by(shortId)%>%
#   dplyr::summarize(sensitivity = mean(fracLeft_tr))

Total looking time (all events)

How stable are control measures across sessions, and do they change with age? Partition variance for each measure: measure ~ age + (1|child/session). (Fraction of total variance explained = intraclass correlation coefficient.) Report coefficient of age & test for significance. Display overall distributions of these measures (one mean per child) and plot measures against sessions (e.g., one line per child)

Mood

Are controls well predicted by mood measures? Regress each control measure (using means per session, and |(mean fLT to right) - 0.5| for side bias as a measure of strength of bias to either side) using model: measure ~ 1 + parentscore + childscore + childactivity + timesincewaking + timeuntilsleep + trial# + (1|child). Report overall significance of model (based on F value) and coefficients of individual predictors. Predictors: Parent score: mean of z-scored parent items Child score: mean of z-scored child items rested, healthy, happy Child activity: calm-active score Time since waking up Time until due for sleep (“overdue” = 0, “no schedule” = missing data.)

Looking Personalities x Test Effects

How well does side bias during control stimuli predict side bias during tests? sb_test ~ sb_control + (1|child). Use mean looking time to right across all same/test trials in a session (sb_control includes up to 3 ‘same’ trials, sb_test includes all other trials except calibration). Report coefficient & test for significance of sb_control.

How well does sensitivity control predict fLT on events? fLT ~ sensitivity + (1|child). One mean fLT value per session, including all tests with unambiguous expected outcome to adults (excluding calibration, same, table up-continue, stay/fall without mostly-on as one of the outcomes). Report coefficient & test for significance of sensitivity.

How well does stickiness predict noisiness of data? variance_salience ~ stickiness + (1|child). Report coefficient & test for significance of stickiness.

How stable are kids’ looking patterns on test stimuli across sessions? How much do the specific videos (e.g. object choices, backgrounds) matter in comparison to the event types? fLT_trial ~ concept/event/comparison + concept:event:comparison:object + concept:event:comparison:object:cameraangle + concept:event:comparison:object:background + concept:event:comparison:object:flip + trial# + (1|child/comparison) + (1|child:session). Report fraction variance explained by child/comparison & by session, coefficient for trial# with significance, and use ANOVA to report overall effects of object, camera angle, background, & flip across children. Do preferences change over the course of the 15 sessions, across children? fLT_trial ~ concept/event/comparison + trial# + session# + (1|child/comparison). Report coefficient for session# and test for significance.

Summary Calculations for future studies

(Guidance for future studies, not specific hypotheses about physics/looking personalities)

Summary of children’s preferences on these events:

Bin together each comparison type (each physics comparison + salience control), all measurements per child. Separately bin by concept (gravity, support, inertia). Add total time looking at target and distractor across all trials to get an fLT measurement.

Bootstrap confidence intervals per child by resampling sessions, then trials.

What fraction of children have a preference for either the expected or unexpected event with 95% CI not overlapping 50% looking, for each grouping? (Just informative for design of future studies - how much data do you need to see individual preferences? May also want to calculate for smaller subsets of the data, e.g. how many sessions until X% children show individually-significant results when group-level effect size is Y.)

LS0tCnRpdGxlOiAiUHJlZmVyZW50aWFsIFBoeXNpY3MgLSBwaWxvdCBhbmFseXNpcyBhbmQgcHJlcmVnaXN0cmF0aW9uISIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgoKYGBge3IgcHJlbGltaW5hcmllcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShoZXJlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGliYmxlKQojbGlicmFyeSh2aW9wbG90KQojbGlicmFyeShjb3JyZ3JhbSkKbGlicmFyeShIbWlzYykKbGlicmFyeShjYXIpCmxpYnJhcnkobmxtZSkgIyBhbGxvd3MgdXNlIG9mIHdlaWdodHMKbGlicmFyeShsbWU0KSAjIG5ld2VyL21haW50YWluZWQsIGFsbG93cyBsb2dpc3RpYyByZWdyZXNzaW9uCiNsaWJyYXJ5KGxzbWVhbnMpCmxpYnJhcnkoTXVNSW4pCmxpYnJhcnkoaWRzKQpsaWJyYXJ5KGdsbW1UTUIpICMgRm9yIGZpdHRpbmcgYmV0YSBkaXN0cmlidXRpb25zCmxpYnJhcnkoZWZmZWN0cykKCgojcGlsb3RkYXRhIDwtIHJlYWQuY3N2KGhlcmUoInJhd19kYXRhIiwicGlsb3RfaW5jbHVkZWRfdHJpYWxzX2RhdGEuY3N2IiksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKI05PVEU6IFdvbid0IHdvcmsgb2ZmIG9mIE1lbGlzc2EncyBsYXB0b3AgZm9yIHByaXZhY3ksIHVzZSB0aGUgZm9sbG93aW5nIGluc3RlYWQKcGlsb3RkYXRhIDwtIHJlYWQuY3N2KGhlcmUoInJhd19kYXRhIiwic2FsdGVkX3BpbG90X2luY2x1ZGVkX3RyaWFsc19kYXRhLmNzdiIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIFVzZWZ1bCByZXNvdXJjZXMKIyBodHRwczovL3d3dy50aGVhbmFseXNpc2ZhY3Rvci5jb20vci1nbG0tbW9kZWwtZml0LwpgYGAKClRoaXMgZG9jdW1lbnQgaXMgdGhlIHByZXJlZ2lzdHJhdGlvbiBmb3IgdGhlIFByZWZlcmVudGlhbCBQaHlzaWNzIHByb2plY3Qgb24gTG9va2l0LiBEYXRhIGNvbGxlY3Rpb24gaXMgY3VycmVudGx5IHVuZGVyd2F5LCBidXQgc2FtcGxlIHNpemUgaGFzIGJlZW4gc2V0IHByaW9yIHRvIGRhdGEgY29sbGVjdGlvbiBraWNrb2ZmICg1MCBwYXJ0aWNpcGFudHMgcmVhY2hpbmcgMTJ0aCBzZXNzaW9uKSwgYW5kIHRoZSB2YXN0IG1ham9yaXR5IG9mIHZpZGVvcyBoYXZlbid0IGV2ZW4gYmVlbiBjb2RlZCBmb3IgbG9va3MsIG11Y2ggbGVzcyBjcml0aWNhbCBEVnMgY2FsY3VsYXRlZC4KClRoaXMgZG9jdW1lbnQgY29udGFpbnMgYSBicmllZiBvcmllbnRhdGlvbiB0byB0aGUgcHJvamVjdCwgbGlua3MgdG8gcmVsZXZhbnQgb3RoZXIgZG9jdW1lbnRhdGlvbiwgYW5kIGEgcmVwcm9kdWNpYmxlIHNldCBvZiBhbmFseXNlcyB0aGF0IHJlYWRzIGluIGEgc2V0IG9mIHBpbG90IGRhdGEgYW5kIGF0dGVtcHRzIHRvIHNldCB1cCB0aGUgbW9kZWwgY29tcGFyaXNvbnMgd2UgYWN0dWFsbHkgY2FyZSBhYm91dCEKCkl0IGZ1bmN0aW9ucyBhcyBhIHByZXJlZ2lzdHJhdGlvbiBpbiB0aGUgc2Vuc2UgdGhhdCwgdGhlIGZpbmFsIGRhdGFzZXQgd2lsbCBiZSBydW4gdGhyb3VnaCB0aGlzIGFuYWx5dGljIGNvZGUgdG8gcHJvZHVjZSB0aGUgdmlzdWFsaXphdGlvbnMgYW5kIG1vZGVscyBzaG93biBoZXJlOyBhbnkgYWRkaXRpb25hbCBhbmFseXNlcyBhZGRlZCBsYXRlciBjYW4gYmUgdHJlYXRlZCBhcyBleHBsb3JhdG9yeS4gV2hlcmUgd2UgaGF2ZSAnZGVjaXNpb24gdHJlZXMnIG9yIHNvbWUgYXNwZWN0IG9mIHRoZSBhbmFseXNpcyBpcyBjb25kaXRpb25hbCBvbiBmZWF0dXJlcyBvZiB0aGUgZmluYWwgZGF0YXNldCwgd2Ugbm90ZSB0aGlzIHdoZXJlIHdlIGtub3cgYWJvdXQgaXQgYW5kIHNwZWNpZnkgaG93IHdlJ2xsIG1ha2UgdGhvc2UgZGVjaXNpb25zLiAKCklmIHlvdSdkIGxpa2UgdG8gc2tpcCBzdHJhaWdodCB0byB0aGUgcHJlcmVnaXN0cmF0aW9uIGRldGFpbHMsIHN0YXJ0IGF0IHRoZSAqRGF0YSBDb250ZW50cyogc2VjdGlvbi4gCgojIEludHJvZHVjdGlvbgoKVGhlIGlkZWEgaXMgdG8gdXNlIGRlbnNlIHNhbXBsaW5nIG9mIGluZGl2aWR1YWwgaW5mYW50cyBvbiBMb29raXQgdG8gY29uZHVjdCBhIGRldGFpbGVkIGFzc2Vzc21lbnQgb2YgdW5kZXJzdGFuZGluZyBvZiBzZXZlcmFsIHBoeXNpY2FsIHByaW5jaXBsZXMuIEhvdyBzdGFibGUgYXJlIGluZGl2aWR1YWwgY29tcG9uZW50cyBhY3Jvc3Mgc2Vzc2lvbnMgYW5kIGhvdyBpbmRlcGVuZGVudD8gV2hhdCBkb2VzIHBhcnRpYWwga25vd2xlZGdlIGxvb2sgbGlrZSBhdCB0aGUgaW5kaXZpZHVhbCBsZXZlbD8KCldlIGFyZSBpbnRlcmVzdGVkIGluIGluZmFudHMnIHByZWZlcmVudGlhbCBsb29raW5nIHJhdGlvIHRvIHNpbXBsZSB2aW9sYXRpb25zIG9mOgoKKglHcmF2aXR5OiBDb21wbGV0ZWx5IHVuc3VwcG9ydGVkIG9iamVjdHMgc2hvdWxkIGZhbGwgZG93biBpbW1lZGlhdGVseSwgcmF0aGVyIHRoYW4gbW92aW5nIHVwLCBjb250aW51aW5nIGluIHRoZWlyIGN1cnJlbnQgdHJhamVjdG9yeSwgb3IgbW92aW5nIGRvd24gYXQgc29tZSBkZWxheS4KCioJSW5lcnRpYTogT2JqZWN0cyBzaG91bGQgY29udGludWUgcm91Z2hseSBpbiB0aGVpciBjdXJyZW50IHRyYWplY3Rvcnkgd2hlbiBncmF2aXR5IGlzIG5vdCBhIGZhY3RvciwgcmF0aGVyIHRoYW4gc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIG9yIHR1cm5pbmcgYXJvdW5kLgoKKglTdXBwb3J0OiB3aGljaCBvZiB0aGUgZm9sbG93aW5nIHNob3VsZCBmYWxsICh2cy4gc3RheSBwdXQpIGFmdGVyIGJlaW5nIHBsYWNlZD8KCiAgICArIEFuIG9iamVjdCBwbGFjZWQgbW9zdGx5IG9uIHRoZSBhbmNob3IKCiAgICArIEFuIG9iamVjdCBwbGFjZWQgb25seSBzbGlnaHRseSBvbiB0aGUgYW5jaG9yCgogICAgKyBBbiBvYmplY3QgdG91Y2hpbmcgdGhlIHNpZGUgb3IgYm90dG9tIG9mIHRoZSBhbmNob3IKCiAgICArIEFuIG9iamVjdCBuZWFyIHRoZSBhbmNob3IgYnV0IG5vdCB0b3VjaGluZyBpdAogCiMjIEJpZyBwaWN0dXJlCgpXaHkgc3R1ZHkgaW5kaXZpZHVhbCBiZWhhdmlvciBpbiBtb3JlIGRldGFpbC0td2hhdCBkbyB3ZSBsb3NlIGluIHN0dWR5aW5nIGdyb3VwcyBvZiBraWRzPyBXZSBkb27igJl0IGtub3cgdGhlIGV4dGVudCB0byB3aGljaCBhIHN1Y2Nlc3MgbWVhbnMgdGhhdCBhIHNpZ25pZmljYW50IGZyYWN0aW9uIG9mIGtpZHMgdGhpcyBhZ2UgY2FuIGRvIHRoaXMgdGFzayBWUyB0aGF0IGFsbCBraWRzIG9mIHRoaXMgYWdlIGNhbiBkbyB0aGlzIHRhc2sgdG8gYSBzaWduaWZpY2FudCBkZWdyZWUuIEFuZCBldmVuIGxvb2tpbmcgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzY29yZXMgZG9lc27igJl0IGNsZWFyIHRoaXMgdXAsIHVubGVzcyBpdOKAmXMgYW4gaW5jcmVkaWJseSBzdHJvbmcgcmVzdWx0IChlLmcuIGFsbCBraWRzIGdldCA5LTEwIG9mIDEwIHF1ZXN0aW9ucyByaWdodCwgb3Igbm8ga2lkcyBnZXQgbW9yZSB0aGFuIDYgb3V0IG9mIDEwKS4gClRoaXMgbWF0dGVycyBmb3IKCioJdW5kZXJzdGFuZGluZyBob3cgYWJpbGl0aWVzIGFyZSByZWxhdGVkIHRvIGVhY2ggb3RoZXI6IHdlIGNhbuKAmXQgZ2V0IG5lYXJseSBhcyBtdWNoIG91dCBvZiBhZ2UtYmFzZWQgcHJvZ3Jlc3Npb25zIHdpdGhvdXQga25vd2luZyBob3cgdGhlIG5vaXNlIHdvcmtz4oCUZXNwZWNpYWxseSBmb3IgcmVzdWx0cyBvZiB0aGUgZm9ybSDigJxuLW1vbnRoLW9sZHMsIGJ1dCBub3QgbS1tb250aC1vbGRzLCBjYW4gZG8gWOKAnQoKKgl1bmRlcnN0YW5kaW5nIHdoYXQgcGFydGlhbCBrbm93bGVkZ2UgJiBtZWNoYW5pc21zIG9mIGNoYW5nZSBpbiBhIGRvbWFpbiBsb29rIGxpa2U6IHdoZW4ga2lkcyDigJxmYWlsLOKAnSBpcyB0aGF0IHNvbWUga2lkcyBtYWtpbmcgYSBjb3JyZWN0IHByZWRpY3Rpb24gYW5kIHNvbWUgbWFraW5nIGFuIGluY29ycmVjdCBwcmVkaWN0aW9uPyBPciBhcmUgdGhleSBhbGwgZmFpbGluZyB0byBtYWtlIGFueSBwcmVkaWN0aW9uIGFuZC9vciBwcmVkaWN0aW5nIGF0IGNoYW5jZT8gV2hlbiBraWRzIHN1Y2NlZWQgYnV0IG5vdCBhdCBjZWlsaW5nLCBhcmUgc29tZSBnZXR0aW5nIG9uZSBhc3BlY3QgYW5kIHNvbWUgYW5vdGhlcj8KIApJdCBtYXkgYmUgdGhhdCBzb21lIGtpZHMgZG9u4oCZdCBleHByZXNzIG5lYXJseS11bml2ZXJzYWwga25vd2xlZGdlIG9uIHRoZSBkZXBlbmRlbnQgbWVhc3VyZXMgd2UgY29sbGVjdC4gV2UgY2FuIGV2YWx1YXRlIHRoaXMgZXhwbGFuYXRpb24gZm9yIG5vaXNlIGFuZC9vciBpbmRpdmlkdWFsIGRpZmZlcmVuY2VzIGJ5IHN0dWR5aW5nIHRoZSBtZXRob2RzIHRoZW1zZWx2ZXMsIGFuZCBraWRz4oCZIGJlaGF2aW9yIG9uIHRoZW06IGUuZy4sIGNhbiB3ZSBwcmVkaWN0IHRoZSB0eXBlcyBvZiBwcmVmZXJlbnRpYWwgbG9va2luZyByZXNwb25zZXMgd2UgZ2V0IGZyb20ga2lkcyBiYXNlZCBvbiBjb250cm9sIHRhc2tzPyBIb3cgc3RhYmxlIGFyZSB0aG9zZSBjb250cm9scyBhbmQgdGFzayBwZXJmb3JtYW5jZSBhY3Jvc3Mgc2Vzc2lvbnM/IChFc3BlY2lhbGx5IGludGVyZXN0aW5nIHdvdWxkIGJlIGRpZmZlcmVuY2VzIHdpdGhpbiBraWRzIGluIGV4cHJlc3Npb246IGtpZHMgbWF5IGdlbnVpbmVseSBleHByZXNzIGtub3dsZWRnZSBhdCBzb21lIHRpbWVzLCBidXQgbm90IG90aGVycywgZHVlIHRvIGF0dGVudGlvbmFsL2Vtb3Rpb25hbCBzdGF0ZSBjaGFuZ2VzLikgCiAKRXNwZWNpYWxseSBpbiBkZXZlbG9wbWVudCwgd2hlcmUgd2XigJlyZSBpbnRlcmVzdGVkIGluIHRoZSB1bmRlcnBpbm5pbmdzIG9mIGh1bWFuIGNvZ25pdGlvbiwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiDigJxzb21lIGJhYmllcyB1c2UgdGhpcyB0eXBlIG9mIGluZm9ybWF0aW9uIGJ1dCBvdGhlcnMgZG8gc29tZXRoaW5nIGVsc2XigJ0gYW5kIOKAnGFsbCBiYWJpZXMgaGF2ZSB0aGlzIHR5cGUgb2YgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIHRoZW0sIHVubGVzcyBzb21ldGhpbmfigJlzIHdyb25n4oCdIG1hdHRlcnMgYSBsb3TigJR0aGlzIGlzIGV4YWN0bHkgd2hlcmUgd2UgY2FyZSBhYm91dCB1bml2ZXJzYWxpdHkuIAoKIyMgRXhwZXJpbWVudGFsIHBhcmFkaWdtCgpDaGlsZHJlbiBjb21wbGV0ZSAyNCAyMC1zZWNvbmQgcHJlZmVyZW50aWFsIGxvb2tpbmcgdHJpYWxzIHBlciBzZXNzaW9uOyBmYW1pbGllcyBhcmUgZW5jb3VyYWdlZCB0byBjb21wbGV0ZSAxNSBzZXNzaW9ucyB3aXRoaW4gMiBtb250aHMuIFBhcmVudHMgY29tcGxldGUgYSBzaG9ydCBtb29kIHN1cnZleSBhbmQgZ28gdGhyb3VnaCBzb21lIGluc3RydWN0aW9ucyBiZWZvcmUgdGhlIHByZWZlcmVudGlhbCBsb29raW5nIHBvcnRpb24uIFRoZXnigJlyZSBhc2tlZCB0byBob2xkIHRoZWlyIGNoaWxkcmVuIGxvb2tpbmcgb3ZlciB0aGVpciBzaG91bGRlcnMgZHVyaW5nIHRoaXMgcG9ydGlvbiB0byBhdm9pZCBwYXJlbnRhbCBiaWFzLiBQYXJlbnRzIGNhbiBlbmQgdGhlIHN0dWR5IGF0IGFueSBwb2ludCBhbmQgc2tpcCB0byB0aGUgcG9zdC1zdHVkeSBzdXJ2ZXkuCiAKRWFjaCB0cmlhbCBiZWdpbnMgd2l0aCBhbiBvYmplY3QgaW50cm8gKHZpZGVvIG9mIEtpbSBzYXlpbmcg4oCcTG9vaywgdGhpcyBpcyBhIOKApuKAnSkgYW5kIGRlbW9uc3RyYXRpbmcgdXNlIG9mIGFuIG9iamVjdCDigJMgZS5nLiBiaXRpbmcgaW50byBhbiBhcHBsZSwgcHV0dGluZyBvbiBoYW5kIGxvdGlvbiwgZHJhd2luZyB3aXRoIGEgbWFya2VyLCBlYXRpbmcgd2l0aCBhIHNwb29uKSB0aGF0IGxhc3RzIGFib3V0IDUgc2Vjb25kcy4KCjx2aWRlbyB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgY29udHJvbHM+CiAgPHNvdXJjZSBzcmM9Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9sb29raXRjb250ZW50cy9leHAtcGh5c2ljcy1maW5hbC9leGFtcGxlcy8wX2ludHJvc0EubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKVGhpcyBpcyBpbnRlbmRlZCBhcyBhbiBhdHRlbnRpb24tZ2V0dGVyIHRvIHJlLW9yaWVudCBjaGlsZHJlbiB0b3dhcmRzIHRoZSBjZW50ZXIsIHdoaWxlIGluIHByaW5jaXBsZSByZWluZm9yY2luZyB0aGF0IHRoZSBvYmplY3QgaW4gcXVlc3Rpb24gaXMgbm90IGFuIGFnZW50IGFuZCBzaG91bGQgYmUgZXhwZWN0ZWQgdG8gZm9sbG93IG5vcm1hbCBwaHlzaWNhbCBsYXdzLiAKClRoZW4sIHR3byBldmVudHMgaW52b2x2aW5nIHRoYXQgb2JqZWN0IGFyZSBzaG93biBzaW11bHRhbmVvdXNseSwgb25lIG9uIHRoZSBsZWZ0IGFuZCBvbmUgb24gdGhlIHJpZ2h0LCBsb29waW5nIGZvciAyNHMgKGV2ZW50IHZpZGVvcyByYW5nZSBmcm9tIGFib3V0IDItNXMpLiBFdmVudHMgYWx3YXlzIHNob3cgdGhlIHNhbWUgb2JqZWN0LCBzYW1lIGNhbWVyYSBhbmdsZSwgc2FtZSBiYWNrZ3JvdW5kLCB3aXRoIGEgZGlmZmVyZW5jZSBvbmx5IGluIHRoZSDigJxvdXRjb21lLuKAnSBFdmVudCB0eXBlcyBhcmUgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93OyBlYWNoIGNvbmNlcHQgaXMgcHJlc2VudGVkIDQtNiB0aW1lcywgd2l0aCAyLTMgcmVwZXRpdGlvbnMgb2YgZWFjaCBldmVudCB0eXBlLiBBbHRob3VnaCBldmVudHMgYXJlIHNob3J0LCB0aGV5IGxvb3AgY29udGludW91c2x5IGZvciAyMHMuIFJlYWx0aW1lIGV2ZW50cyBhcmUgc2hvd24gc28gdGhhdCDigJxleHBlY3RlZOKAnSBldmVudHMgYXJlIGF0IG5hdHVyYWwgc3BlZWRzLCBhbmQgbm90IHBvdGVudGlhbGx5IHNlZW4gYXMgdmlvbGF0aW5nIHBoeXNpY2FsIHByaW5jaXBsZXMgZHVlIHRvIGhhcHBlbmluZyB0b28gc2xvd2x5LgoKPHZpZGVvIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb250cm9scyBsb29wPgogIDxzb3VyY2Ugc3JjPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbG9va2l0Y29udGVudHMvZXhwLXBoeXNpY3MtZmluYWwvc3RpbXVsaS90YWJsZS9tcDQvc2JzX3RhYmxlX2NvbnRpbnVlX2Rvd25fbG90aW9uX2MyXzFfTlIubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKUGFyZW50cyBjYW4gcGF1c2UgaW5kaXZpZHVhbCB0cmlhbHMuIElmIHRoZXkgcGF1c2UgZHVyaW5nIHRoZSBpbnRybywgdGhleSBqdXN0IHN0YXJ0IG92ZXIgdXBvbiByZXN0YXJ0aW5nLiBJZiB0aGV5IHBhdXNlIGR1cmluZyB0aGUgdGVzdCAodXAgdG8gb25lIHRpbWUgcGVyIHRyaWFsKSB0aGV5IHJlc3RhcnQgZnJvbSB0aGUgaW50cm8sIGJ1dCB0aGVuIHRoZSBsZWZ0IGFuZCByaWdodCB0ZXN0IHZpZGVvcyBhcmUgc3dpdGNoZWQgZm9yIHRoZSB0ZXN0IHBoYXNlLgogCiMjIyBUcmlhbCBhc3NpZ25tZW50ICYgb3JkZXJpbmcKCihTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSB0cmlhbCB0eXBlcy4pIFRyaWFscyBjeWNsZSB0aHJvdWdoIGdyYXZpdHksIGluZXJ0aWErY2FsaWJyYXRpb24sIHN1cHBvcnQsIGFuZCBjb250cm9sIChzYW1lL3NhbGllbmNlKSBwYWlyaW5ncyBkdXJpbmcgYSBzZXNzaW9uOyB0aGUgb3JkZXIgb2YgdGhlc2UgY29uY2VwdHMgaXMgY2hvc2VuIGZyb20gYSBsaXN0IGFuZCBjaGFuZ2VkIChjeWNsaW5nIHRocm91Z2ggYSBsaXN0IG9mIG9yZGVycykgZWFjaCBzZXNzaW9uLiBUaGVyZSBhcmUgc2l4IHZpZGVvcyBzaG93biBpbiBlYWNoIGNhdGVnb3J5IGluIHRvdGFsLiAKCldpdGhpbiBlYWNoIGNhdGVnb3J5LCBvYmplY3RzIGFyZSBhc3NpZ25lZCB0byBjb21wYXJpc29uIHR5cGVzIChlLmcuIOKAnGFwcGxl4oCdIGFzc2lnbmVkIHRvIOKAnHRhYmxlLCBkb3duIHZzLiB1cOKAnSkgYnkgY2hvb3NpbmcgZnJvbSBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBtYXBwaW5ncywgYWdhaW4gaW5jcmVtZW50ZWQgcGVyIHNlc3Npb24uIChUaGUgZmlyc3Qgc2Vzc2lvbiB2YWx1ZSB3YXMgc2VsZWN0ZWQgcmFuZG9tbHkgZnJvbSB0aGUgZmlyc3Qgc2l4IG9wdGlvbnMgaW5pdGlhbGx5IFtieSBhY2NpZGVudF0sIGFuZCBpcyBub3cgc2VsZWN0ZWQgZnJvbSBhbGwgcG9zc2libGUgbWFwcGluZ3MuKSAKClRoZXJlIGFyZSBzaXggcG9zc2libGUgY29tcGFyaXNvbnMgZm9yIHRoZSBzdGF5IGFuZCBmYWxsIGV2ZW50czsgdGhyZWUgY29tcGFyaXNvbnMgYXJlIGFzc2lnbmVkIHRvIHN0YXkgYW5kIHRocmVlIHRvIGZhbGwsIHdpdGggdGhlIHNlbGVjdGlvbiBhZ2FpbiBjeWNsaW5nIHRocm91Z2ggYSByYW5kb20gbGlzdCBvZiBzdWNoIGFzc2lnbm1lbnRzIHBlciBzZXNzaW9uLiBMZWZ0L3JpZ2h0IHBsYWNlbWVudCwgaG9yaXpvbnRhbCBmbGlwcGluZyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgZXZlbnRzLCBjYW1lcmEgYW5nbGVzLCBhbmQgYmFja2dyb3VuZHMgYXJlIGNob3NlbiByYW5kb21seSB3aXRoIHRoZSBjb25zdHJhaW50IHRoYXQgaGFsZiBvZiB0aGUg4oCYbW9yZSBwcm9iYWJsZeKAmSBldmVudHMgYXJlIG9uIHRoZSBsZWZ0IHdpdGhpbiBlYWNoIGNhdGVnb3J5LiBDYWxpYnJhdGlvbiB0cmlhbHMgKGdyb3VwZWQgd2l0aCBpbmVydGlhIHZpZGVvcyBmb3IgcHVycG9zZXMgb2YgYXNzaWduaW5nIG9iamVjdCBpbnRyb3MpIGFyZSBwbGFjZWQgYXQgdHJpYWxzIDMgYW5kIDYsIHNvIHRoYXQgdGhleSBhcmUgYWx3YXlzIGF2YWlsYWJsZSBmb3Iga2lkcyB3aG8gY29tcGxldGVkIGVub3VnaCB0cmlhbHMgZm9yIHRoZSBzZXNzaW9uIHRvIGJlIGluY2x1ZGVkIChhbmQgc28gdGhhdCBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgaW4gY29kaW5nIHF1YWxpdHkgYWNyb3NzIHRyaWFscywgd2XigJlyZSBub3QgZXhjbHVkaW5nIG9uIHRoZSBiYXNpcyBvZiB3aGVuIGNhbGlicmF0aW9uIGhhcHBlbmVkKS4KCgojIyBFdmVudCB0eXBlcwoKIyMjIEdyYXZpdHkKCiMjIyMgVGFibGUKCjx2aWRlbyB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgY29udHJvbHMgbG9vcD4KICA8c291cmNlIHNyYz0iaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2xvb2tpdGNvbnRlbnRzL2V4cC1waHlzaWNzLWZpbmFsL2V4YW1wbGVzLzNfdGFibGUubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgpPYmplY3QgaXMgcm9sbGVkL3NsaWQgb2ZmIGEgdGFibGUgYW5kIGNvbnRpbnVlcyAqZG93biosICpob3Jpem9udGFsKiwgb3IgKnVwKi4KCgojIyMjIFRvc3MgCgo8dmlkZW8gd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIGNvbnRyb2xzIGxvb3A+CiAgPHNvdXJjZSBzcmM9Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9sb29raXRjb250ZW50cy9leHAtcGh5c2ljcy1maW5hbC9leGFtcGxlcy8yX3Rvc3MubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgpPYmplY3QgaW4gaGFuZCBpcyAqdG9zc2VkIGRvd24sIGZhbGxzIFVQKiwgKnRvc3NlZCB1cCwgZmFsbHMgRE9XTiouCgojIyMjIFJhbXAKCjx2aWRlbyB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgY29udHJvbHMgbG9vcD4KICA8c291cmNlIHNyYz0iaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2xvb2tpdGNvbnRlbnRzL2V4cC1waHlzaWNzLWZpbmFsL2V4YW1wbGVzLzFfcmFtcC5tcDQiIHR5cGU9InZpZGVvL21wNCI+CjwvdmlkZW8+CgpPYmplY3QgaXMgcGxhY2VkIGluIGNlbnRlciBvZiByYW1wIGFuZCByZWxlYXNlZCB0byByb2xsICpkb3duKiBvciAqdXAqLgoKIyMjIEluZXJ0aWEKCiMjIyMgU3RvcAoKPHZpZGVvIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb250cm9scyBsb29wPgogIDxzb3VyY2Ugc3JjPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbG9va2l0Y29udGVudHMvZXhwLXBoeXNpY3MtZmluYWwvZXhhbXBsZXMvNF9zdG9wLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KPC92aWRlbz4KCk9iamVjdCByb2xscyBmcm9tIG9uZSBzaWRlIG9mIHNjcmVlbiBhbmQgc3RvcHMgaW4gdGhlIG1pZGRsZSwgdGhlbiByZS1zdGFydHMgKm9uIGl0cyBvd24qLCBvciAqYnkgYSBoYW5kKi4KCiMjIyMgUmV2ZXJzZQoKPHZpZGVvIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb250cm9scyBsb29wPgogIDxzb3VyY2Ugc3JjPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbG9va2l0Y29udGVudHMvZXhwLXBoeXNpY3MtZmluYWwvZXhhbXBsZXMvNF9yZXZlcnNlLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KPC92aWRlbz4KCk9iamVjdCByb2xscy9zbGlkZXMgZnJvbSBvbmUgc2lkZSBvZiB0aGUgc2NyZWVuIGFuZCBjb2xsaWRlcyB3aXRoIGEgKmJhcnJpZXIqLCBvciB0YWtlcyB0aGUgc2FtZSB0cmFqZWN0b3J5IGNvbGxpZGluZyBhZ2FpbnN0ICpubyBiYWlycmllciouCgojIyMgU3VwcG9ydAoKIyMjIyBGYWxsCgo8dmlkZW8gd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIGNvbnRyb2xzIGxvb3A+CiAgPHNvdXJjZSBzcmM9Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9sb29raXRjb250ZW50cy9leHAtcGh5c2ljcy1maW5hbC9leGFtcGxlcy81X2ZhbGwubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKQW4gb2JqZWN0IGlzIHBsYWNlZCAoKm1vc3RseSBvbiovKnNsaWdodGx5IG9uKi8qbmV4dCB0byovKm5lYXIqKSBvbiBhIGNhYmluZXQgYW5kIGltbWVkaWF0ZWx5IGZhbGxzLgoKIyMjIyBTdGF5Cgo8dmlkZW8gd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIGNvbnRyb2xzIGxvb3A+CiAgPHNvdXJjZSBzcmM9Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9sb29raXRjb250ZW50cy9leHAtcGh5c2ljcy1maW5hbC9leGFtcGxlcy82X3N0YXkubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKQW4gb2JqZWN0IGlzIHBsYWNlZCAoKm1vc3RseSBvbiovKnNsaWdodGx5IG9uKi8qbmV4dCB0byovKm5lYXIqKSBvbiBhIGNhYmluZXQgYW5kIHN0YXlzIHRoZXJlLgoKIyMjIENvbnRyb2wKCiMjIyMgU2FtZQoKPHZpZGVvIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb250cm9scyBsb29wPgogIDxzb3VyY2Ugc3JjPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbG9va2l0Y29udGVudHMvZXhwLXBoeXNpY3MtZmluYWwvZXhhbXBsZXMvN19jb250cm9sX3NhbWUubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKRGlzdGluZ3Vpc2hhYmxlIGJ1dCBzaW1pbGFyIHBoeXNpY2FsbHktcG9zc2libGUgaHVtYW4gYWN0aW9ucyBvbiBvYmplY3RzLCBsaWtlIHJvdGF0aW5nIGFuIG9iamVjdCBhYm91dCBvbmUgYXhpcyB2cy4gYW5vdGhlcgoKIyMjIyBTYWxpZW5jZQoKPHZpZGVvIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb250cm9scyBsb29wPgogIDxzb3VyY2Ugc3JjPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbG9va2l0Y29udGVudHMvZXhwLXBoeXNpY3MtZmluYWwvZXhhbXBsZXMvN19jb250cm9sX3NhbGllbmNlLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KPC92aWRlbz4KClBoeXNpY2FsbHktcG9zc2libGUgaHVtYW4gYWN0aW9ucyBvbiBvYmplY3RzLCBzb21lIG1vcmUgaW50ZXJlc3RpbmcsIGxpa2UgZmxpcHBpbmcgYSBzcG9vbiB2cy4gc2xvd2x5IGV4dGVuZGluZyBpdCBvciBlcmFzaW5nIGEgZHJhd2luZyB2cy4gYW4gZW1wdHkgYm9hcmQuCgojIyMjIENhbGlicmF0aW9uCgo8dmlkZW8gd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIGNvbnRyb2xzIGxvb3A+CiAgPHNvdXJjZSBzcmM9Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9sb29raXRjb250ZW50cy9leHAtcGh5c2ljcy1maW5hbC9zdGltdWxpL2F0dGVudGlvbi9tcDQvY2FsaWJyYXRpb25fTFIubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgoKQSBzcGlubmluZyBiYWxsIG1vdmVzIGFjcm9zcyB0aGUgZW50aXJlIHNjcmVlbi4KCiMgRGF0YXNldCBjb250ZW50cwoKSGVyZSB3ZSBkZXNjcmliZSB0aGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgZmluYWwgZGF0YXNldC4gU29tZSBvZiB0aGlzIGluZm8gaXMgKm5vdCogYXZhaWxhYmxlIGZvciB0aGUgcGlsb3QgZGF0YXNldCwgaW4gcGFydGljdWxhciBhbnl0aGluZyBoYXZpbmcgdG8gZG8gd2l0aCBtb3JlIHRoYW4gb25lIHNlc3Npb24uCgojIyMgUGVyIGNoaWxkCgoqCUFnZSBhdCBzdGFydAoKKglEZW1vZ3JhcGhpYyBpbmZvIChvcHRpb25hbCwgdHlwaWNhbGx5IHJlcG9ydGVkKTogZmFtaWx5IGluY29tZSwgbGFuZ3VhZ2VzIHNwb2tlbiBhdCBob21lLCBwYXJlbnQgZWR1Y2F0aW9uIGxldmVsKHMpLCBudW1iZXIgb2YgcGFyZW50cyBpbiB0aGUgaG9tZSwgbnVtYmVyIG9mIGNoaWxkcmVu4oCZcyBib29rcyBpbiB0aGUgaG9tZSwgY2hpbGTigJlzIHJhY2UsIG51bWJlciBhbmQgYWdlIG9mIHNpYmxpbmdzLCBjb3VudHJ5ICsgVVMgc3RhdGUgaWYgaW4gVVMsIHVyYmFuL3N1YnVyYmFuL3J1cmFsCgojIyMgUGVyIHNlc3Npb24gKEF2YWxpYWJsZSBvbmNlIHZpZGVvIGlzIGhhbmQtY29kZWQpCgoqIENoaWxk4oCZcyBhZ2UKCioJTnVtYmVyIG9mIHByZXZpb3VzIHNlc3Npb25zIGNvbXBsZXRlZAoKKiBUaW1lIHNpbmNlIGxhc3Qgc2Vzc2lvbgoKKglNb29kIGRhdGEgKEJlZm9yZSBiZWdpbm5pbmcgc3R1ZHksIGJ5IHBhcmVudCByZXBvcnQuIFNjYWxlcyAxLTc6IENISUxEOiB0aXJlZC1yZXN0ZWQsIHNpY2staGVhbHRoeSwgZnVzc3ktaGFwcHksIGNhbG0tYWN0aXZlOyBQQVJFTlQ6IHRpcmVkLWVuZXJnZXRpYywgb3ZlcndoZWxtZWQtb250b3BvZnRoaW5ncywgdXBzZXQtaGFwcHkuIEhvdyBsb25nIHNpbmNlIGNoaWxkIHdva2UgdXAsIGhvdyBsb25nIHNpbmNlIGNoaWxkIGF0ZSwgaG93IGxvbmcgdW50aWwgY2hpbGQgaXMgZHVlIGZvciBuYXAvc2xlZXA7IHdoYXQgY2hpbGQgd2FzIGRvaW5nIGJlZm9yZSB0aGlzLikKCiMjIyBQZXIgdHJpYWwKCioJVGltZSBsb29raW5nIEwsIFIgKGZ1bGwgdGltZSBzZXF1ZW5jZSBvZiBsb29rcyBsZWZ0LCByaWdodCwgYXdheSkKCioJTnVtYmVyIG9mIGZpeGF0aW9ucyAoZGVyaXZlZCBmcm9tIHRoZSBmaXJzdCBvbmUpCgoqIFByb3BvcnRpb24gbG9va2luZyB0byBMLCBvdXQgb2YgdGltZSBsb29raW5nIHRvIHNjcmVlbiAoZGVyaXZlZCBmcm9tIHRoZSBmaXJzdCBvbmUpCgoqCVBhcmVudCBiZWhhdmlvcjogdGltZXMgb2YgdGFsa2luZywgcG9pbnRpbmcsIGFuZCBwZWVraW5nCgoqCUluZmFudCBiZWhhdmlvcjogdGltZXMgb2YgZnVzc2luZyAmIHJhdGluZyBvZiBmdXNzaW5lc3MgbGV2ZWwgbG93IG9yIGhpZ2gKCioJVHJpYWwgbnVtYmVyCgojIyMgUHJlZGljdG9ycyBmb3IgZnJhY3Rpb24gdGltZSB0byBsZWZ0CgoqCUNvbXBhcmlzb24gdHlwZSAoZS5nLiByYW1wIHVwIHZzLiBkb3duKSwgbmVzdGVkIHdpdGhpbgoKKglFdmVudCB0eXBlIChlLmcuIHJhbXApLCBuZXN0ZWQgd2l0aGluLi4uCgoqCUNvbmNlcHQgKGdyYXZpdHksIGluZXJ0aWEsIHN1cHBvcnQpCgoqCU9iamVjdCAoYXBwbGUsIGxvdGlvbiBib3R0bGUsIHNjaXNzb3JzLi4uKQoKKglXaGV0aGVyIGVhY2ggc2lkZSBpcyB1bmV4cGVjdGVkIChpLmUuLCBkb2VzIHRoZSBldmVudCBvbiB0aGUgbGVmdCBjbGVhcmx5IHZpb2xhdGUgYSBwaHlzaWNhbCBwcmluY2lwbGU/IERvZXMgdGhlIGV2ZW50IG9uIHRoZSByaWdodD8gU29tZXRpbWVzIGJvdGggYXJlIHVuZXhwZWN0ZWQgdG8gYWR1bHRzLCBlLmcuIHdoZW4gYW4gb2JqZWN0IG5lYXIgYSBjYWJpbmV0IGFuZCBhbiBvYmplY3QgbmV4dC10byBhIGNhYmluZXQgc3RheSBwdXQ7IHNvbWV0aW1lcyBuZWl0aGVyIGlzLiBJbiBzb21lIGNhc2VzIHRoaXMgZGVwZW5kcyBvbiB0aGUgY2hpbGTigJlzIHBvdGVudGlhbCBiZWxpZWZzLCBzZWUgbW9kZWxpbmfigKYpICYgd2hpY2ggc2lkZSBpcyAqbGVzcyogZXhwZWN0ZWQuCgojIyBTYW1wbGUgc2l6ZSAmIHJlY3J1aXRtZW50IHByb2NlZHVyZXMKCkFnZSByYW5nZSA0LTEyIG1vbnRocyBhdCBzdGFydCBvZiBzdHVkeTsgY29udGludWUgZm9yIHVwIHRvIDYxIGRheXM7IHRhcmdldCDigJhjb21wbGV0ZeKAmSBkYXRhc2V0IGlzIDEyIHVzYWJsZSBzZXNzaW9ucy4gKE5vIG1ham9yIGFnZSBkaWZmZXJlbmNlcyBpbiBkYXRhIHF1YWxpdHkgb3Igc2FsaWVuY2Uvc2FtZSBjb250cm9scyBzZWVuIGluIHBpbG90aW5nLikKIApQbGFuIHRvIHJlY3J1aXQgYXMgbGFyZ2UgYSBiYWxhbmNlZCBzYW1wbGUgYXMgcHJhY3RpY2FsIGdpdmVuIHRpbWUgY29uc3RyYWludHMgb24gYm90aCB0ZXN0aW5nIGFuZCByZWNydWl0aW5nOyBhaW1pbmcgZm9yIDUwIHBhcnRpY2lwYW50cyB3aXRoIGEgY29tcGxldGUgZGF0YXNldC4gQWxsIHJlY3J1aXRtZW50IGRlY2lzaW9ucyBhcmUgLyBoYXZlIGJlZW4gbWFkZSB3aXRob3V0IGV4YW1pbmluZyBkZXBlbmRlbnQgdmFyaWFibGVzLiBUaGlzIHdpbGwgYWxzbyBiZSB0aGUgY2FzZSBpZiB3ZSBtdXN0IHRlcm1pbmF0ZSBkYXRhIGNvbGxlY3Rpb24gZWFybHkgKGkuZS4gZm9yIHRpbWluZy9mdW5kaW5nIGNvbnN0cmFpbnRzKQoKIyMgRGF0YSBleGNsdXNpb24gJiBkaXNhbWJpZ3VhdGlvbgogIApBbGwgcGFydGlhbCBkYXRhc2V0cyAoPDEyIHNlc3Npb25zKSBhbmQgYW55IGV4dHJhIGRhdGEgY29sbGVjdGVkIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGFuYWx5c2lzLiBEYXRhIHdpbGwgb25seSBiZSBleGNsdWRlZCBmcm9tIGFuYWx5c2lzIGlmIGl0IG1lZXRzIGFueSBvZiB0aGUgY3JpdGVyaWEgYmVsb3c7IHdlIGFpbSB0byBpbmNsdWRlIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSBhbmQgdXNlIGFuYWx5c2VzIHRoYXQgYXJlIHJvYnVzdCB0byBtaXNzaW5nLyd1bmJhbGFuY2VkJyBkYXRhLiBEYXRhIG1heSBiZSBleGNsdWRlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIHBhcnRpY2lwYW50IChpLmUuIGFsbCBkYXRhIGZyb20gdGhhdCBjaGlsZCBpcyBleGNsdWRlZCksIHNlc3Npb25zLCBvciBpbmRpdmlkdWFsIHRyaWFsLiAKCk5vdGUgYWxzbyB0aGF0IGJlY2F1c2UgKGEpIHdlIG1heSBleGNsdWRlIHNvbWUtYnV0LW5vdC1hbGwgZGF0YSBmcm9tIGEgcGFydGljaXBhbnQgYW5kIChiKSB0aGUgbnVtYmVyIG9mIHRpbWVzIGJhYnkgaXMgdGFrZW4gdG8gaGF2ZSBzZWVuIHRoZSBzdHVkeSBpcyByZWxldmFudCwgdGhlICdzdHVkeSBudW1iZXInICg9IG51bWJlciBvZiBzZXNzaW9ucyBzZWVuKSBtYXkgZGlmZmVyIGZyb20gYSBzaW1wbGUgY291bnQgb2YgdGhlIHNlc3Npb25zIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQuIAoKIyMjIENoaWxkIGxldmVsCgoqIEdlc3RhdGlvbmFsIGFnZSBhdCBiaXJ0aCA8IDM3IHdlZWtzLCBmb3IgYW55IGFuYWx5c2VzIHVzaW5nIGFnZS4gVW5rbm93biBnZXN0YXRpb25hbCBhZ2Ugd2lsbCBiZSB1c2VkIGJ1dCBwcmV2YWxlbmNlIHJlcG9ydGVkLiAoRm9sbG93dXAgdG8gY2hlY2sgdGhhdCBpbmNsdXNpb24gb2YgcHJlbWF0dXJlIGluZmFudHMgZG9lcyBub3QgcXVhbGl0YXRpdmVseSBhZmZlY3Qgb3RoZXIgcmVzdWx0cywgYW5kL29yIHRvIGRpc3BsYXkgcmVzdWx0cyBmcm9tIHByZW1hdHVyZSBpbmZhbnRzIHdpdGggYWRqdXN0ZWQvbm9uLWFkanVzdGVkIGFnZSAtIGV4cGxvcmF0b3J5LikKCiogQ2hpbGRyZW4gd2hvIHBhcnRpY2lwYXRlZCBpbiB0aGUgcGlsb3Qgc3R1ZHkKCiogQ2hpbGRyZW4gd2hvc2UgcGFyZW50cyBzcG9udGFuZW91c2x5IHJlcG9ydCBkZXZlbG9wbWVudGFsL21lZGljYWwgaXNzdWVzIHRoYXQgd291bGQgbGlrZWx5IGV4cGxhaW4gc29tZSBkaWZmZXJlbmNlcyBpbiB0YXNrOiB2aXNpb24gb3IgaGVhcmluZyBpbXBhaXJtZW50OyBjb2duaXRpdmUgb3IgbmV1cm9sb2dpY2FsIGRpc29yZGVycyBpbmNsdWRpbmcgZHVlIHRvIHRyaXNvbWllcy4gCgoqIE5vdGUgYWdhaW46IFdlICppbmNsdWRlKiBkYXRhIGZyb20gY2hpbGRyZW4gd2l0aCBhbnkgbnVtYmVyIG9mIHNlc3Npb25zICh3aWxsIHByb2JhYmx5IGhhdmUgbWFueSB3aXRoIDwxMiBpbiBhZGRpdGlvbiB0byDigJxjb21wbGV0ZeKAnSBkYXRhKTsgYW5hbHlzZXMgZGVzY3JpYmVkIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSB0aGlzIGFwcHJvcHJpYXRlbHkuCgoKIyMjIFNlc3Npb24gbGV2ZWwKCiogU2Vzc2lvbnMgd2hlcmUgY2hpbGRyZW4gYXJlIG91dHNpZGUgYWdlIHJhbmdlIG9mIDQtMTQgbW9udGhzLCBleGNlcHQgZm9yIGJpbm5lZC1ieS1hZ2UgYW5hbHlzZXMgd2hlcmUgd2UgbWF5IGRpc3BsYXkgZGF0YSBmcm9tIGNoaWxkcmVuIG91dHNpZGUgdGhlIGFnZSByYW5nZSAod2l0aG91dCBhZmZlY3RpbmcgYW55IG90aGVyIHZhbHVlcykgaWYgd2UgZW5kIHVwIGhhdmluZyBpdC4gQWRqdXN0ZWQgYWdlIHdpbGwgYmUgdXNlZCBmb3IgcHJlbWF0dXJlIGluZmFudHMuCgoqIFNlc3Npb25zIHdpdGggPCA2IHRyaWFscyAoJiBkb27igJl0IGNvdW50IGFzIGEgc2Vzc2lvbiBmb3Igc2Vzc2lvbiAjIHB1cnBvc2VzKS4gUGFyZW50cyBhcmUgZW5jb3VyYWdlZCBub3QgdG8gY29tcGxldGUgc2Vzc2lvbnMgd2l0aGluIDYgaG91cnMgb2YgZWFjaCBvdGhlci4gRm9yIGVhY2ggc2Vzc2lvbiAocHJvY2VzcyBsYXRlciAtPiBlYXJsaWVyKSwgaWYgYW5vdGhlciBzZXNzaW9uIHdpdGggZmV3ZXIgY29tcGxldGVkIHRyaWFscyBoYXBwZW5lZCB3aXRoaW4gc2l4IGhvdXJzLCB1c2UgdGhpcyBvbmUgaW5zdGVhZC5UaGlzIGxlYWRzIHRvIHJlYXNvbmFibGUgb3V0Y29tZXMgZXZlbiBpbiB0aGUgdW5saWtlbHkgZXZlbnQgc29tZW9uZeKAmXMgZG9pbmcgdGhlIHN0dWR5IGV2ZXJ5IDUgaG91cnMuIAoKKiBSZXF1aXJlIGNhbGlicmF0aW9uIHBlcmZvcm1hbmNlID43NSUgdG8gdXNlIHNlc3Npb24uIENhbGlicmF0aW9uIHNjb3JlcyBzZWVtIHRvIGJlIG1vc3RseSBkdWUgdG8gZGlmZmljdWx0eSBjb2RpbmcgYW5kIG1pZ2h0IHRoZXJlZm9yZSBpbmRleCBvdmVyYWxsIGNvbmZpZGVuY2UgaW4gb3RoZXIganVkZ21lbnRzOyB0aW1pbmcgZGlmZmVyZW5jZXMgaW4gd2ViY2FtIHN0cmVhbSB2cy4gZGlzcGxheWVkIHN0aW11bGkgd2lsbCBhbHNvIGFmZmVjdCBjYWxpYnJhdGlvbi4gUG9vbCBhbGwgbG9va2luZyBhY3Jvc3MgdGhlIHR3byBjYWxpYnJhdGlvbiB0cmlhbHMgdG8gY29tcHV0ZSBhbiBvdmVyYWxsIGNhbGlicmF0aW9uIHNjb3JlLCBzbyB0aGF0IGlmIGtpZHMgYXJlbuKAmXQgbG9va2luZyBhcyBtdWNoIGZvciBvbmUgb2YgdGhlIHRyaWFscyB3ZSBkb27igJl0IGF2ZXJhZ2UgaW4gYSBtdWNoIG5vaXNpZXIgbWVhc3VyZW1lbnQuIFNjb3JlIGlzIGZyYWN0aW9uYWwgbG9va2luZyB0aW1lIHRvIGNvcnJlY3Qgc2lkZSBkdXJpbmcgdGhlIG1pZGRsZSBvZiBwZXJpb2RzIHdoZW4gdGhlIGJhbGwgc2hvdWxkIGJlIHN0YXRpYzogWzAuNSwgMy41XSwgWzUuNSwgOC41XSwgWzEwLjUsIDEzLjVdLCBbMTUuNSwgMTguNV0sIFsyMC41LCAyMy41XS4KCiogSWYgdGhlIHBhcnRpY2lwYW50IGhhcyA8MTIgdXNhYmxlIHNlc3Npb25zIHNwcmVhZCBvdmVyID42MCBkYXlzLCB1c2Ugc2Vzc2lvbnMgZnJvbSB0aGUgZWFybGllc3QgNjAtZGF5IHBlcmlvZCAoaW5jbHVzaXZlKSB3aXRoIHRoZSBtb3N0IHVzYWJsZSBzZXNzaW9ucy4gSWYgdGhlIHBhcnRpY2lwYW50IGhhcyA+PTEyIHVzYWJsZSBzZXNzaW9ucyBvdmVyID42MCBkYXlzLCB1c2Ugc2Vzc2lvbnMgZnJvbSB0aGUgZWFybGllc3QgNjAtZGF5IHBlcmlvZCAoaW5jbHVzaXZlKSB3aXRoIGF0IGxlYXN0IDEyIHNlc3Npb25zLiAKCiogV2hlcmUgYWJzb2x1dGUgc2Vzc2lvbiBudW1iZXIgKGFzIGFuIGluZGV4IG9mIGhvdyBtYW55IHRpbWVzIHRoZSBjaGlsZCBoYXMgc2VlbiBzdGltdWxpLCBldGMuKSBpcyByZWxldmFudCwgYXNzaWduIHRoZSBmaXJzdCBzZXNzaW9uIHVzZWQgaW4gYW5hbHlzaXMgYSBzZXNzaW9uIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiDigJhleHBlcmllbmNlZCBzZXNzaW9uc+KAmSBpbiB0aGUgcHJlY2VkaW5nIDYwIGRheXMuIEV4cGVyaWVuY2VkIHNlc3Npb25zIGluY2x1ZGUgc2Vzc2lvbnMgd2hlcmUgdGhlIGNoaWxkIGlzIG91dCBvZiBhZ2UgcmFuZ2Ugb3IgY2FsaWJyYXRpb24gcGVyZm9ybWFuY2UgaXMgcG9vciwgYnV0IG5vdCBzZXNzaW9ucyB3aXRoIDw2IHRyaWFscy4gKEZvciBpbnN0YW5jZSwgaWYgYSBjaGlsZCBwYXJ0aWNpcGF0ZXMgYXQgNCBtb250aHMgb2YgYWdlIGFuZCB0aGVuIDEyIHRpbWVzIGZyb20gMTAtMTEgbW9udGhzLCB0aGUgbGF0dGVyIHNldCBvZiBkYXRhIGlzIHVzZWQgYW5kIHRoZSBmaXJzdCBzZXNzaW9uIGF0IDEwIG1vbnRocyBpcyBjb25zaWRlcmVkIHNlc3Npb24gMS4gSWYgYSBjaGlsZCBwYXJ0aWNpcGF0ZXMgb24gZGF5cyAxLCAzMCwgMzUsIDQwLCA0NSwgNTAsIDU1LCA2MCwgNjUsIDcwLCA3NSwgODAsIHRoZW4gc2Vzc2lvbnMgc3RhcnRpbmcgYXQgZGF5IDMwIGFyZSB1c2VkIGJ1dCB0aGUgZmlyc3Qgc2Vzc2lvbiBudW1iZXIgaXMgMi4KCgojIyMgVHJpYWwgbGV2ZWwKCiogUmVxdWlyZSA+PSAycyBsb29raW5nIHRvIHVzZSBhIHRyaWFsLiBEb27igJl0IG90aGVyd2lzZSBkZWFsIHdpdGggc2hvcnRlci9sb25nZXIgTFRzIGV4Y2VwdCBpbiAoZXhwbG9yYXRvcnkpIG1vZGVsLgoKKiBPbWl0IHBlcmlvZHMgd2hlcmUgdGhlIGNoaWxkIGlzIG91dCBvZiBmcmFtZSBvciBnYXplIGlzIG90aGVyd2lzZSBpbXBvc3NpYmxlIHRvIGNvZGUuIFRyZWF0IGFzIG91dCBvZiBmcmFtZSBhbnkgcGVyaW9kcyB3aGVyZSB0aGUgdmlkZW8gaXMg4oCYZnJvemVu4oCZIGZvciA+MXMgKHN0YXJ0IHRyZWF0aW5nIGFzIG91dCBvZiBmcmFtZSAxcyBhZnRlciB0aGlzIHBlcmlvZCBiZWdpbnMpIGFuZCByZXBvcnQgcHJldmFsZW5jZS4KCiogRXhjbHVkZSB0cmlhbHMgd2hlcmUgY2hpbGQgaXMgZnVzc2luZyA+NTAlIG9mIHRoZSB0cmlhbC4gSW4gY29udHJhc3QgdG8gb21pdHRpbmcgcGVyaW9kcyB3aGVyZSBjaGlsZCBpcyBmdXNzaW5nLCB0aGlzIGF2b2lkcyBkZXBlbmRlbmNlIG9uIGV4YWN0bHkgd2hpY2ggZnJhbWVzIGFyZSBjb25zaWRlcmVkIGZ1c3N5LCBhdCB0aGUgY29zdCBvZiBhIHRocmVzaG9sZCBlZmZlY3Qgd2UgZXhwZWN0IG5vdCB0byBhZmZlY3QgbWFueSB0cmlhbHMuID41MCUgYXBwbGllcyB0byBsZW5ndGggb2YgdmlkZW8sIG5vdCBvdGhlcndpc2UgY29kYWJsZSBkYXRhIChpLmUuIHdlIGFsbG93IGZ1c3MgY29kaW5nIGR1cmluZyBvdXRvZmZyYW1lIHBlcmlvZHMpLgoKKiBQYXJlbnQgaW50ZXJmZXJlbmNlOiBFeGNsdWRlIHBlcmlvZHMgb2YgdHJpYWxzIGFmdGVyIHBhcmVudCBwZWVrcywgcG9pbnRzIHdoaWxlIHBlZWtpbmcsIG9yIHNwZWFrcyBpbiBhbnkgd2F5IHRoYXQgY291bGQgYmlhcyBjaGlsZCAo4oCcd2hhdOKAmXMgdGhhdCBiYWxsIGRvaW5nP+KAnSBidXQgbm90IOKAnGtlZXAgbG9va2luZyBzd2VldGllIeKAnSkgSW5jbHVkZSBwZXJpb2RzIHdoZXJlIHRoZSBwYXJlbnTigJlzIGV5ZXMgYXJlIG5vdCB2aXNpYmxlIGFuZCB3ZSBjYW7igJl0IHRlbGwgd2hlcmUgdGhleeKAmXJlIGxvb2tpbmcgKHVubGVzcyB0aGVyZSBpcyByZWFzb24gdG8gYmVsaWV2ZSB0aGV5IGFyZSBsb29raW5nKSBhbmQgcGVyaW9kcyB3aGVyZSB0aGUgcGFyZW50IGlzIGxvb2tpbmcgYXdheSBidXQgbWF5IHNlZSBzdGltdWxpIHBlcmlwaGVyYWxseS4KCgojIFRoZSBQaWxvdCBEYXRhc2V0CgpUaGlzIGlzIGEgcGlsb3QgZGF0YXNldCwgaXQgY29uc2lzdHMgb2YgKGNsZWFuZWQsIHBvc3QtZGF0YSBleGNsdXNpb24sIHBvc3QgdHJpYWwtcHJvcG9ydGlvbiBjYWxjdWxhdGlvbnMpIGEgc2V0IG9mIHN1YmplY3RzIHdobyBwYXJ0aWNpcGF0ZWQgaW4gKm9uZSogcGh5c2ljcyBzZXNzaW9uIHRoYXQgaXMgc2ltaWxhciB0byB0aGUgc2Vzc2lvbnMgdGhhdCBhcmUgYmVpbmcgcnVuIGluIHRoZSBtYWluIGRhdGEgY29sbGVjdGlvbi4gVGhlIHByaW5jaXBsZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHBpbG90IGRhdGFzZXQgaGFzIGV4YWN0bHkgMSBzZXNzaW9uIHBlciBwYXJ0aWNpcGFudCwgYW5kIHRoZSBjb25kaXRpb25zIFggYW5kIFkgYXJlIGFic2VudC4gCgpRVUVTVElPTiBGT1IgS0lNOiBJcyBpdCB0aGUgY2FzZSB0aGF0IGFsbCBleGNsdXNpb24gY3JpdGVyaWEgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gdGhlIHBpbG90IGRhdGFzZXQ/IChJbiBwYXJ0aWN1bGFyOiBjcml0ZXJpYSBmb3IgY2FsaWJyYXRpb24/KQoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmhlYWQocGlsb3RkYXRhKQoKI0NvbHVtbnMgdGhhdCBtYXkgaW5jbHVkZSBQSUkKIy1CaXJ0aGRheQojLVRlc3QgZGF0ZSArIGFnZQojLU5hbWUvZW1haWwgc3RyaW5ncwoKIyBoZWFkKGRwbHlyOjpzZWxlY3QocGlsb3RkYXRhLCBjaGlsZC5wcm9maWxlSWQsIGFnZVJlZ2lzdHJhdGlvbiwgYWdlRXhpdHN1cnZleSkpCiMgCiMgI0dvb2QgbmV3cyEgT25seSBjaGlsZC5wcm9maWxlSWQgaXMgYSBwb3NzaWJsZSBkYW5nZXIgKHBhcnRpY2lwYW50cyBjb3VsZCBmcmVlbHkgY2hvb3NlIGEgbmFtZSwgYW5kIG9mdGVuCiMgI3VzZWQgc29tZSBvciBhbGwgb2YgdGhlaXIgcmVhbCBuYW1lKTsgZGF0YXNldCBoYXMgYWdlIGJ1dCBpcyBmdWxseSBkYXRlIGZyZWUKIyAjQWRkIGh1bWFuLWZyaWVuZGx5IElkcyBpbiBwbGFjZSBvZiB0aG9zZQojIHNldC5zZWVkKDI1NDMyKQojIHBpbG90ZGF0YSA8LSBwaWxvdGRhdGEgJT4lCiMgICBncm91cF9ieShjaGlsZC5wcm9maWxlSWQpICU+JQojICAgbXV0YXRlKGNoaWxkLnByb3F1aW50ID0gcHJvcXVpbnQoKSklPiUKIyAgIHVuZ3JvdXAoKSU+JQojICAgZHBseXI6OnNlbGVjdCgtYyhjaGlsZC5wcm9maWxlSWQsWCkpCiMgCiMgd3JpdGUuY3N2KHBpbG90ZGF0YSwgaGVyZSgicmF3X2RhdGEiLCJzYWx0ZWRfcGlsb3RfaW5jbHVkZWRfdHJpYWxzLmNzdiIpKQoKYGBgCgpgYGB7ciBlY2hvID0gRkFMU0V9CiNUaGlzIGlzIHRoZSBwbGFjZSB0byBtYWtlIHN1cmUgdmFyaWFibGVzIGFyZSBhbGwgd2VsbCBiZWhhdmVkIHVwIGhlcmUgKGUuZy4gZmFjdG9ycyBhcmUgZmFjdG9ycywgbnVtZXJhbHMgYXJlIG51bWVyYWxzLCBOQSBhcmUgTkEpIQoKcGlsb3RkYXRhIDwtIHBpbG90ZGF0YSAlPiUKICBtdXRhdGUobGVzc0V4cGVjdGVkTGVmdCA9IGZhY3RvcihsZXNzRXhwZWN0ZWRMZWZ0KSkKYGBgCgpBcyBhIHdhcm11cCwgd2UnbGwgYmVnaW4gYnkgdmlzdWFsaXppbmcgdGhlIHBpbG90IGRhdGFzZXQgZm9yIHNvbWUgYmFzaWMgcHJvcGVydGllcy4gRmlyc3QsIHdlIGV4cGVjdCB0aGF0IGJhYmllcycgdG90YWwgbG9va2luZyB0aW1lIHdpbGwgZHJvcCBvdmVyIHRpbWUgKGkuZS4gbGF0ZXIgdHJpYWxzIGhhdmUgc2hvcnRlciBsb29raW5nIHRpbWVzKS4gCgpgYGB7ciwgZWNobyA9IEZBTFNFfSAKTFRfbWVhbnNfcGVyX2NoaWxkX3Blcl90cmlhbCA8LSBwaWxvdGRhdGEgJT4lCiAgZ3JvdXBfYnkoc2hvcnRJZCwgdHJpYWxudW0pICU+JQogIHN1bW1hcmlzZShUTFQgPSBtZWFuKHRvdGFsTFQpKQoKZyA8LSBnZ3Bsb3QoTFRfbWVhbnNfcGVyX2NoaWxkX3Blcl90cmlhbCwgYWVzKHkgPSBUTFQsIHggPSB0cmlhbG51bSkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKwogIHlsYWIoJ0xvb2tpbmcgdGltZSBpbiBzZWNvbmRzJykrCiAgeGxhYignVHJpYWwgbnVtYmVyJykKCnByaW50KGcpCmBgYAoKTmV4dCwgd2UnbGwgYmVnaW4gcGxvdCB0aGUgY3JpdGljYWwgRFYgLSBob3cgbXVjaCB0aW1lIGRvIGJhYmllcyBzcGVuZCBsb29raW5nIGF0IHN1cnByaXNpbmcgdGhpbmdzPyBOb3RlIGEgY29tcGxpY2F0aW9uIG9mIHRoZSBkYXRhc2V0IGhlcmU6IHdlIHdpbGwgYmUgKm1vZGVsaW5nKiB0aGUgJ3JhdycgZGVwZW5kZW50IHZhcmlhYmxlLCBgZnJhY0xlZnRgICh0aGF0IGlzLCBvdXQgb2Ygc29tZSBhbW91bnQgb2YgdGltZSBzdGFyaW5nIGF0IHRoZSBzY3JlZW4sIHdoYXQgcGVyY2VudGFnZSBvZiB0aGF0IHRpbWUgaXMgc3BlbnQgbG9va2luZyBhdCB0aGUgbGVmdC1oYW5kIHZpZGVvPykuIFRoZW4gaW4gZ2VuZXJhbCwgd2UnbGwgYmUgYXNraW5nIHdoZXRoZXIgdGhpcyBwcm9wb3J0aW9uIGlzICphZmZlY3RlZCogYnkgYGxlc3NFeHBlY3RlZExlZnRgIC0gaXMgd2hpY2hldmVyIHZpZGVvIGlzIG1vc3Qgc3VycHJpc2luZyAoZnJvbSBhbiBhZHVsdCBwb2ludCBvZiB2aWV3KSBsb2NhdGVkIG9uIHRoZSBsZWZ0IG9yIHRoZSByaWdodD8KClJlbWVtYmVyIHRoYXQgYGxlc3NFeHBlY3RlZExlZnRgIGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50IHZpZGVvL3ZpZGVvIHBhaXIgdHlwZSBmb3IgZXZlcnkgYGV2ZW50YCBhbmQgYGNvbmNlcHRgLiBDcml0aWNhbGx5LCB0aGlzIHZhbHVlIGlzIHVuZGVmaW5lZCBmb3Igc29tZSBldmVudCB0eXBlcywgaW4gcGFydGljdWxhciB0aGUgU0FNRSBldmVudHMuIAoKRmlyc3QsIGEgaGlzdG9ncmFtIG9mIGRpc3RyaWJ1dGlvbnM6CgpgYGB7ciwgZWNobyA9IEZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHBpbG90ZGF0YSwgYWVzKHg9ZnJhY0xlZnQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwKQoKYGBgCgpUaGlzIHJlc2VtYmxlcyBhIHN5bW1ldHJpYyBiZXRhIGRpc3RyaWJ1dGlvbiB3aXRoIGEgJ2J1bXAnIGluIHRoZSBtaWRkbGUgKG9yIGEgbWl4dHVyZSBvZiBtdWx0aXBsZSBwYXJhbWV0ZXIgc2V0dGluZ3M/LiAgVGhpcyBpcyBhY3R1YWxseSBzZW5zaWJsZSwgYmVjYXVzZSBpdCBpbmNsdWRlcyBjb3VudGVyYmFsYW5jaW5nIG9mIGFsbCAnc3VycHJpc2FsJyBldmVudHMsIGFuZCBiZWNhdXNlIHRoZSBhYm92ZSBjb250YWlucyBjYXNlcyB3aGVyZSBiYWJpZXMgbWF5IHVzdWFsbHkgbG9vayBhYm91dCBlcXVhbGx5IGF0IGJvdGggc2lkZXMgKGUuZy4gdGhlIFNBTUUgY29uZGl0aW9uKSwgYW5kIGNhc2VzIHdoZXJlIHNvbWUgKGJ1dCBub3QgYWxsISkgYmFiaWVzIHdpbGwgY29uc2lzdGVudGx5IGxvb2sgbW9yZSBhdCBvbmUgdmlkZW8gb3IgdGhlIG90aGVyLiBUbyB0ZXN0IHRoaXMsIGxldCdzIHRyeSBmYWNldGluZyBvdXQgYnkgZXZlbnQuCgpgYGB7ciBlY2hvID0gRkFMU0V9CmdncGxvdChkYXRhID0gcGlsb3RkYXRhLCBhZXMoeD1mcmFjTGVmdCkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjApICsKICBmYWNldF93cmFwKH5ldmVudCkKYGBgClBsb3QgYWdhaW4gd2l0aG91dCBjYWxpYnJhdGlvbiBldmVudCBzbyB3ZSBjYW4gc2VlIG1vcmUgY2xlYXJseToKCmBgYHtyIGVjaG8gPSBGQUxTRX0KcGlsb3RkYXRhX25jIDwtIHBpbG90ZGF0YSAlPiUKICBmaWx0ZXIoZXZlbnQgIT0gImNhbGlicmF0aW9uIikKCmdncGxvdChkYXRhID0gcGlsb3RkYXRhX25jLCBhZXMoeD1mcmFjTGVmdCkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjApICsKICBmYWNldF93cmFwKH5ldmVudCkKYGBgCgojIEJ1aWxkIHRoZSBiYXNpYyBtb2RlbAoKTGV0J3MgYXNzdW1lIHRoYXQgd2UncmUgIGRlYWxpbmcgd2l0aCBiZXRhIGRpc3RyaWJ1dGlvbnMuIFRpbWUgdG8gYnVpbGQgdXAgdGhlIG1vZGVsISBXZSdsbCB1c2UgdGhlIGdsbW1UTUIgcGFja2FnZS4KClFVRVNUSU9OIEZPUiBQQVRSSUNLOiBBbnkgcmVhc29uL2xpbWl0YXRpb24gb2YgdGhpcyBwYWNrYWdlIHRvIGJlIGF3YXJlIG9mPwoKRmlyc3QsIHNldCB1cCB0aGUgZmFtaWx5IG9mIGRpc3RyaWJ1dGlvbnMgd2UnbGwgYmUgdXNpbmc6CgpgYGB7ciBlY2hvPUZBTFNFfQoKI0JldGEgZGlzdHJpYnV0aW9ucyBoYXRlIGV4YWN0IDAvMSB2YWx1ZXMsIHRyYW5zZm9ybSB0aGVtIGF3YXkuIApjb252ZXJ0MDEgPC0gZnVuY3Rpb24oeSkgewogIG4gPC0gbGVuZ3RoKHkpCiAgeTIgPC0gKHkqKG4tMSkgKyAwLjUpL24KICByZXR1cm4oeTIpCn0KCnBpbG90ZGF0YSA8LSBwaWxvdGRhdGEgJT4lCiAgbXV0YXRlKGZyYWNMZWZ0X3RyID0gY29udmVydDAxKGZyYWNMZWZ0KSkKCgpmaXRiZXRhMSA8LSBnbG1tVE1CKGZyYWNMZWZ0X3RyIH4gMSwgZGF0YSA9IHBpbG90ZGF0YSwgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGExKQpgYGAKCgojIyMjIFNoYXJlZCByYW5kb20vZml4ZWQgZWZmZWN0cwoKT3VyIGdvYWwgaGVyZSBpcyB0byBkZWFsIHdpdGggdGhlICdib3JpbmcnIGZpeGVkICYgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlIHRoYXQgc2hvdWxkIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgKmFsbCBzdWJzZXF1ZW50IG1vZGVscyouIFRoYXQgaXMsIHdlIHdhbnQgdG8gY2FwdHVyZSB0aGUgc3RydWN0dXJlIG9mIHRoZSB0YXNrIGlzIGEgc2Vuc2libGUgd2F5LCBzbyB3ZSBjYW4gdGVzdCBoeXBvdGhlc2VzIG9uIHRvcCBvZiBpdC4gCgpTb21lIHJlbWluZGVyczoKCnNob3J0SUQgLSB0aGUgcGFydGljaXBhbnQKc3RpbXVsaSAtIHRoZSBpbmRpdmlkdWFsIHN0aW11bHVzCgpXZSBhaW0gZm9yIGNvbmNsdXNpb25zIHRvIGdlbmVyYWxpemUgb3ZlciBib3RoIGluZGl2aWR1YWwgY2hpbGRyZW4gJiBzdGltdWxpLCBzbyB0cmVhdCBib3RoIGFzIHJhbmRvbSBmYWN0b3JzLgoKYGBge3IgZWNobz1GQUxTRX0KZml0YmV0YTIgPC0gZ2xtbVRNQihmcmFjTGVmdF90ciB+IDEgKyAoMXxzaG9ydElkKSArICgxfHN0aW11bGkpLCBkYXRhID0gcGlsb3RkYXRhLCBmYW1pbHkgPSBiZXRhX2ZhbWlseShsaW5rID0gImxvZ2l0IikpCnN1bW1hcnkoZml0YmV0YTIpCmBgYAoKKEZpdHRpbmcganVzdCBpbnRlcmNlcHRzIGZvciBub3cpCgpRVUVTVElPTiBGT1IgUEFUUklDSzogQVBQUk9QUklBVEUgU0xPUEVTPyBUaGUgc3RhbmRhcmQgYWR2aWNlIEkndmUgcmVjaWV2ZWQgaXMgdG8gaW5jbHVkZSBtYXhpbWFsIHNsb3BlcyBmb3IgYWxsIHJhbmRvbSBlZmZlY3RzLCBidXQgaWYgSSdtIGdvaW5nIHRvIGJlIGJ1aWxkaW5nIHVwIHRoZSBmaXhlZCBlZmZlY3RzIGFzIEkgZ28sIEknbSBub3Qgc3VyZSB3aGF0IHRoZSByaWdodCBvcmRlciBvZiBvcGVyYXRpb25zIGlzIGhlcmUuIAoKU29tZSAnYm9yaW5nJyBmaXhlZCBlZmZlY3RzIHRoYXQgYXJlIHJlbGV2YW50IGZvciBhbGwgaXRlbXM6CgphZ2VSZWdpc3RyYXRpb24gLSB0aGUgYWdlIG9mIHRoZSBjaGlsZAp0cmlhbG51bSAtIFRoZSB0cmlhbCBudW1iZXIKCkJvdGggb2YgdGhlc2UgbWF5IG1hdHRlciBvbiB0aGVpciBvd24gKGluIGdlbmVyYWwsIGxvb2tpbmcgdGltZXMgY3VydmVzIGNvdWxkIGNoYW5nZSB3aXRoIGFnZSwgb3Igd2l0aCB0aW1lIGdvaW5nIHRocm91Z2ggdGhlIGV4cGVyaW1lbnQpLCBhbmQgbWF5IGFsc28gaW50ZXJhY3QgKG9sZGVyIGNoaWxkcmVuIG1pZ2h0IGdldCBib3JlZCBmYXN0ZXIsIGZvciBpbnN0YW5jZS4pCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaXRiZXRhMyA8LSBnbG1tVE1CKGZyYWNMZWZ0X3RyIH4gYWdlUmVnaXN0cmF0aW9uKnRyaWFsbnVtICsgKDF8c2hvcnRJZCkgKyAoMXxzdGltdWxpKSwgZGF0YSA9IHBpbG90ZGF0YSwgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGEzKQpgYGAKClFVRVNUSU9OIEZPUiBQQVRSSUNLOiAKCjEpIFNob3VsZCBJIGJlIGRlY2lkaW5nIGF0IHRoaXMgc3RhZ2Ugd2hldGhlciB0byBkcm9wIGFueSBvZiB0aGVzZSBmYWN0b3JzPyBPciBzcGVjaWZ5aW5nIGEgZGVjaXNpb24gcnVsZSB0aGF0IEknbGwgdXNlIHRvIGRldGVybWluZSBob3cgdG8gdHJlYXQgdGhlIGV2ZW50dWFsIGRhdGFzZXQ/CgoyKSBNYW55ICd2YWx1ZSBvdXQgb2YgcmFuZ2UgaW4gJ2xnYW1tYScnIG1lc3NhZ2VzIGdlbmVyYXRlZC4gV2hlbiBhcmUgdGhlc2UgcHJvYmxlbWF0aWMgdnMuIG5vdD8gU29tZXRpbWVzIHNlbnNpYmxlLWxvb2tpbmcgc3VtbWFyaWVzIGFyZSBnZW5lcmF0ZWQsIGNhbiBJIHRydXN0IHRoZW0/CgozKSBOT1RFOiBJbiB0aGUgZnVsbCBkYXRhc2V0LCB3ZSdkIGFsc28gd2FudCB0byBpbmNsdWRlIGEgdGVybSBmb3Igc2Vzc2lvbiBudW1iZXIgKGhvdyBtYW55IHNlc3Npb25zIHRoaXMgY2hpbGQgaGFzIHNlZW4uKSBUaGlzIHdpbGwgYmUgdmVyeSBoaWdobHkgY29ycmVsYXRlZCB3aXRoIGFnZSwgc2luY2UgdGhleSBib3RoIHVuZm9sZCBvdmVyIHRpbWUuIFdoYXQgdG8gZG8gYWJvdXQgdGhpcz8KCk1vcmUgY29tcGxleCBtb2RlbHMgb2YgdGhlIHRhc2sgaXRzZWxmIG1heSBiZSBhcHByb3ByaWF0ZSAoZXNwZWNpYWxseSBmb3IgdGhlICdMb29raW5nIFBlcnNvbmFsaXRpZXMnIGFuYWx5c2VzKSwgYnV0IHdlIGFpbSB0byBzZWxlY3QganVzdCBvbmUgbW9kZWwgdG8gdXNlIGZvciBidWlsZGluZyB1cCB0aGUgcGh5c2ljcyBtb2RlbHMuIE9uY2Ugd2Ugc2V0dGxlIG9uIHRoaXMgJ3Rhc2sgbW9kZWwnLCB3ZSBjYW4gcHJvY2VlZCB0byB3b3JrIG9uIGFkZGluZyBmYWN0b3JzIGZvciBtb2RlbGluZyB0aGUgcXVlc3Rpb25zIHdlJ3JlIGludGVyZXN0ZWQgaW4hCgo0KSBCZXRhIGRpc3RyaWJ1dGlvbiBmYW1pbHkgaGFzIHR3byBwYXJhbWV0ZXJzLiBIb3cgYXJlIHRob3NlIHBhcmFtZXRlcnMgJ2FsbG93ZWQnIHRvIHZhcnkgaWYgYWdlUmVnaXN0YXRpb24gaXMgaW5jbHVkZWQgYXMgYSBzaW5nbGUgdGVybSBhcyBhYm92ZT8gSWRlYWxseSwgSSdkIGxpa2UgdG8gYmUgYWJsZSB0byBjYXB0dXJlIGFnZSB0cmVuZHMgbGlrZSAiYXMgQWdlUmVnaXN0cmF0aW9uIHJpc2VzLCB0aGUgbWVhbiBtb3ZlcyBhd2F5IGZyb20gMC41Ii4KCjUpSXMgdGhlcmUgYSBnb29kIHdheSB0byBzYXZlIHRoZSBtb2RlbCB3ZSBzZWxlY3QgaGVyZSBhcyBhIHZhcmlhYmxlIHNvIGl0IGNhbiBiZSByZWZlcmVuY2VkIGluIHN1YnNlcXVlbnQgbW9kZWxzIGJlbG93PyBJdCdzIHBvc3NpYmxlIHRoYXQgYSBzbGlnaHRseSBkaWZmZXJlbnQgbW9kZWwgd2lsbCBiZSB3YXJyYW50ZWQgaW4gdGhlIGZpbmFsIGRhdGFzZXQgdGhhbiB0aGlzIHBpbG90IGRhdGFzZXQgKHdlJ2xsIG5lZWQgdG8gcHJlcmVnaXN0ZXIgYSBkZWNpc2lvbiBydWxlIGhlcmUuKQoKIyMjIyBQaHlzaWNzIHByZWRpY3RvcgoKVGhlIHByaW1hcnkgcHJlZGljdG9yIHdlIGFyZSBpbnRlcmVzdGVkIGluIGlzIHdoZXRoZXIgY2hpbGRyZW4gbG9vayBsb25nZXIgKG9yIGF0IGxlYXN0IGEgbm9uLWNoYW5jZSBmcmFjdGlvbiEpIGF0IHVuZXhwZWN0ZWQgZXZlbnRzIChsZXNzRXhwZWN0ZWRMZWZ0KS4gVG8gY29tcGxpY2F0ZSB0aGluZ3MsIHRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIGZvciB0d28gZXZlbnQgdHlwZXMgKHNhbWUsIGNhbGlicmF0aW9uKS4gV2UnbGwgbGVhdmUgdGhvc2Ugb3V0IGZvciBub3cgKHRoZXkgYXJlIHVzZWQgb25seSBmb3IgdGhlICdsb29raW5nIHBlcnNvbmFsaXR5JyByZXN1bHRzLikKCmBgYHtyIGVjaG89RkFMU0V9CgpzYW1lX2NhbCA8LSBwaWxvdGRhdGEgJT4lCiAgZmlsdGVyKGV2ZW50ID09ICJzYW1lInxldmVudCA9PSAiY2FsaWJyYXRpb24iKQoKcGh5c2ljc19ldmVudHMgPC0gcGlsb3RkYXRhICU+JQogIGZpbHRlcihldmVudCAhPSAic2FtZSIgJiBldmVudCAhPSAiY2FsaWJyYXRpb24iKQpgYGAKCkZvciB0aGUgcXVlc3Rpb25zIGFib3V0IGluZmFudHMnIGtub3dsZWRnZSBvZiBwaHlpY3MsIHdlJ2xsIGxpbWl0IG91cnNlbHZlcyB0byB0aGlzIHF1ZXN0aW9uIGFib3V0IHVuZXhwZWN0ZWRuZXNzISBUbyBtb2RlbCB0aGlzLCB3ZSBzaW1wbHkgYWRkIGEgdGVybSB0byB0aGUgbW9kZWw6IAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmZpdGJldGE0IDwtIGdsbW1UTUIoZnJhY0xlZnRfdHIgfiBsZXNzRXhwZWN0ZWRMZWZ0KmFnZVJlZ2lzdHJhdGlvbip0cmlhbG51bSArICgxfHNob3J0SWQpICsgKDF8c3RpbXVsaSksIGRhdGEgPSBwaHlzaWNzX2V2ZW50cywgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGE0KQpgYGAKCk5PVEU6IEluIHRoZSBwaWxvdCBkYXRhc2V0LCB0aGlzIGFjdHVhbGx5IG1ha2VzIHRoZSBvdmVyYWxsIEFJQy9CSUMgZ2V0ICp3b3JzZSo7IHRoaXMgaXMgcmVsYXRpdmVseSB1bnN1cnByaXNpbmcgc2luY2UgbWFueSBvZiB0aGVzZSBjb21wYXJpc29ucyB5aWVsZCBhIGZpbmRpbmcgKHdoZW4gZ3JhcGhlZCkgdGhhdCBjaGlsZHJlbiBkbyAqbm90KiBzZWVtIHRvIGJlIGFmZmVjdGVkIGJ5IHN1cnByaXNpbmduZXNzISBJdCB3b3VsZCBhbHNvIG5vdCBiZSB0ZXJyaWJseSBzaG9ja2luZyB0byBmaW5kIGluIHRoZSByZWFsIGRhdGFzZXQsIHNpbmNlIGx1bXBpbmcgYWxsIHRoZSBldmVudCB0eXBlcyBhbmQgYWdlcyB0b2dldGhlciBpcyBub3QgYXBwcm9wcmlhdGUuIAoKUVVFU1RJT04gRk9SIFBBVFJJQ0s6IEkgYW0gdXNlZCB0byBjb21wYXJpbmcgbW9kZWxzIHdpdGggYW5vdmEobW9kZWwxLCBtb2RlbDIpLCBidXQgd29uZGVyIGlmIHRoZXJlIGlzIGEgYmV0dGVyIGNob2ljZS4gSSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gZXhwcmVzcyBjb25maWRlbmNlIHRoYXQgaW5jbHVkaW5nIHRoZSB0ZXJtIGlzIHdhcnJhbnRlZCAoZS5nLiAnc3VycHJpc2luZ25lc3MgbWF0dGVycycpLiBUaGlzIGNvdWxkIGJlIHAtdmFsdWVzIG9yIHNvbWV0aGluZyBlbHNlLCBidXQgd291bGQgc3Ryb25nbHkgcHJlZmVyIHRvIGJlIHVzaW5nIG9ubHkgb25lIChmYW1pbHkgb2YpIGh5cG90aGVzaXMtdGVzdGluZyBtZXRyaWMuCgojIEV2ZW50LWdlbmVyYWwgbW9kZWxzICYgaHlwb3RoZXNlcwoKVG8gZ2V0IGFjdHVhbGx5IGludGVycHJldGFibGUgbW9kZWxzIHRoYXQgd2UgY2FuIHRlc3QsIGZpcnN0IHRha2UgZWFjaCBldmVudCB0eXBlIChSYW1wLCBGYWxsLCBTdGF5LCBldGMuKSBpbmRpdmlkdWFsbHksIGFuZCAoYSkgYXNrIHdoZXRoZXIgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gc3VycHJpc2luZ25lc3MgYW5kIGFnZSBpcyBzaWduaWZpY2FudCBvdmVyYWxsIGZvciB0aGF0IHN1YnNldCAoaS5lLiByZXBlYXQgdGhlICd0YXNrIG1vZGVsJyBmb3IgZWFjaCBldmVudCB0eXBlLCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluZGVwZW5kZW50IGV4cGVyaW1lbnRzKSwgKGIpIGFzayB3aGV0aGVyIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBmcm9tIGNoYW5jZSBhdCAxMm1vLCBhbmQgKGMpIERpc3BsYXkgYWdlIHRyZW5kcy4gCgpRVUVTVElPTiBGT1IgS0lNOiBZb3Ugd3JvdGUgIkNvdWxkIGFsc28gZG8gbWVhbiBmTFQgfiBhZ2UgKyBjb21wYXJpc29uVHlwZSArICgxfGNoaWxkKSBvciBzaW1pbGFyLCBleGNlcHQgZm9yIGNvbmNlcm5zIGFib3V0IGRpZmZlcmluZyBjb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2V0cyBvZiBjb21wYXJpc29uIHR5cGVzLiIgVGhpcyBpcyB3aGF0IEkgZGlkIChzaW5jZSBib3RoIGFyZSBpZGVudGljYWwgZm9yIHRoZSBzaW5nbGUtc2Vzc2lvbiB2ZXJzaW9uKSwgYnV0IGNhbiB5b3Ugc2F5IG1vcmUgYWJvdXQgdGhpcz8KClNvLCB3ZSdsbCBmaXJzdCBzZXQgdXAgdGhlIGNvbW1vbiBwbGFuLCBhbmQgdGhlbiBleGVjdXRlIGVhY2ghCgpgYGB7ciBlY2hvPUZBTFNFfQoKI2dyYXZpdHkKI3RhYmxlIChOZXcgZm9yIG1haW4gZGF0YXNldCkKdG9zcyA8LSBmaWx0ZXIocGh5c2ljc19ldmVudHMsIGV2ZW50ID09ICJ0b3NzIikKcmFtcCA8LSBmaWx0ZXIocGh5c2ljc19ldmVudHMsIGV2ZW50ID09ICJyYW1wIikKCiNpbmVydGlhCiNzdG9wIChOZXcgZm9yIG1haW4gZGF0YXNldCkKI3JldmVyc2UgKE5ldyBmb3IgbWFpbiBkYXRhc2V0KQoKI3N1cHBvcnQKZmFsbCA8LSBmaWx0ZXIocGh5c2ljc19ldmVudHMsIGV2ZW50ID09ICJmYWxsIikKc3RheSA8LSBmaWx0ZXIocGh5c2ljc19ldmVudHMsIGV2ZW50ID09ICJzdGF5IikKCiNjb250cm9sCnNhbGllbmNlIDwtIGZpbHRlcihwaHlzaWNzX2V2ZW50cywgZXZlbnQgPT0gInNhbGllbmNlIikKCmBgYAoKIyBTYWxpZW5jZQoKKFRoaXMgaXMgdGhlIHRlbXBsYXRlIG1vZGVsIGZvciBhbGwgb3RoZXIgaW5kaXZpZHVhbCBldmVudHM7IGp1c3QgaW5jbHVkaW5nIFNhbGllbmNlIGhlcmUgZm9yIHNwYWNlOyBhbmFseXNlcyB3aWxsIGJlIHBhcmFsbGVsLikKCmBgYHtyIGVjaG89RkFMU0V9CiNNb2RlbApmaXRiZXRhX3NhbGllbmNlIDwtIGdsbW1UTUIoZnJhY0xlZnRfdHIgfiBsZXNzRXhwZWN0ZWRMZWZ0KmFnZVJlZ2lzdHJhdGlvbip0cmlhbG51bSArICgxfHNob3J0SWQpICsgKDF8c3RpbXVsaSksIGRhdGEgPSBzYWxpZW5jZSwgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGFfc2FsaWVuY2UpCgojVmFsdWUgYXQgMTIgbW9udGhzPwpwcmVkaWN0X2FnZV9hdCA9IHNlcSg0LDE1LDEpCnByZWRpY3RfZnJhY0xlZnQgPSBFZmZlY3QobW9kID0gZml0YmV0YV9zYWxpZW5jZSwgZm9jYWwucHJlZGljdG9ycyA9IGMoImFnZVJlZ2lzdHJhdGlvbiIsICJsZXNzRXhwZWN0ZWRMZWZ0IiksIHhsZXZlbHMgPSAxMDApCgojQ29udmVydCB0byBmcmFjTGVzc0V4cGVjdGVkCnByZWRpY3RfbGVzc0V4cGVjdGVkIDwtIGFzLmRhdGEuZnJhbWUocHJlZGljdF9mcmFjTGVmdCkgJT4lCiAgbXV0YXRlKGZyYWNMZWZ0ID0gZml0LAogICAgICAgICBmcmFjTGVzc0V4cGVjdGVkID0gaWZlbHNlKGxlc3NFeHBlY3RlZExlZnQgPT0gVFJVRSwgZml0LCAxLWZpdCksCiAgICAgICAgIGxvd2VyTEUgPSBpZmVsc2UobGVzc0V4cGVjdGVkTGVmdCA9PSBUUlVFLCBsb3dlciwgMS11cHBlciksCiAgICAgICAgIHVwcGVyTEUgPSBpZmVsc2UobGVzc0V4cGVjdGVkTGVmdCA9PSBUUlVFLCB1cHBlciwgMS1sb3dlcikpICU+JQogIGdyb3VwX2J5KGFnZVJlZ2lzdHJhdGlvbiklPiUKICBkcGx5cjo6c3VtbWFyaXplKGZMRSA9IG1lYW4oZnJhY0xlc3NFeHBlY3RlZCksIHNlID0gbWVhbihzZSksIGxvd2VyID0gbWVhbihsb3dlckxFKSwgdXBwZXIgPSBtZWFuKHVwcGVyTEUpKQoKIyBEbyBhIHBsb3QhCnRvcGxvdCA8LSBzYWxpZW5jZSAlPiUKICBncm91cF9ieShzaG9ydElkKSU+JQogIGRwbHlyOjpzdW1tYXJpemUoZkxFID0gbWVhbihmcmFjTGVzc0V4cGVjdGVkKSwgYWdlID0gbWVhbihhZ2VSZWdpc3RyYXRpb24pKQoKZyA9IGdncGxvdCgpICsKICBnZW9tX2ppdHRlcihkYXRhID0gdG9wbG90LCBhZXMoeT1mTEUsIHg9YWdlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsKICBnZW9tX2xpbmUoZGF0YT1wcmVkaWN0X2xlc3NFeHBlY3RlZCxhZXMoeCA9IGFnZVJlZ2lzdHJhdGlvbiwgeSA9IGZMRSksbHdkPTEsIGxpbmV0eXBlPSJzb2xpZCIpKwogIGdlb21fZXJyb3JiYXIoZGF0YT1wcmVkaWN0X2xlc3NFeHBlY3RlZCxhZXMoeCA9IGFnZVJlZ2lzdHJhdGlvbiwgeW1pbj1sb3dlciwgeW1heD11cHBlcikpCiAgCmcKYGBgCgojIEV2ZW50LXNwZWNpZmljIG1vZGVscyBhbmQgaHlwb3RoZXNlcwoKQWZ0ZXIgcHJlZGljdGluZyB3aGV0aGVyIGNoaWxkcmVuIGJlY29tZSBtb3JlIHNlbnNpdGl2ZSB0byAoYWR1bHQtZGVmaW5lZCkgc3VycHJpc2luZyB2ZXJzaW9ucyA+IGxlc3Mgc3VycHJpc2luZyB2ZXJzaW9ucyBvZiBlYWNoIGV2ZW50IHR5cGUsIHdlIHdpbGwgYXNrIHNvbWUgZnVydGhlciBxdWVzdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gZWFjaCBkb21haW4sIGFuZCBhbHNvIGF0dGVtcHQgdG8gZGlzY292ZXIgd2hldGhlciB0aGUgdGhlb3JldGljYWwgY2x1c3RlcmluZ3MgKG9mIGNvbXBhcmlzb25zIGludG8gZXZlbnRzLCBhbmQgZXZlbnRzIGludG8gY29uY2VwdHMpIGFjdHVhbGx5IHJlZmxlY3QgaW5kaXZpZHVhbCBjaGlsZHJlbnMnIHBlcmZvcm1hbmNlcy4gCgpGb3IgYWxsIG9mIHRoZXNlLCB3ZSdsbCBzdGFydCB3aXRoICdzdXJwcmlzaW5nbmVzcycgbW9kZWwgYWJvdmUsIGFuZCBhc2sgd2hldGhlciB2YXJpb3VzIGFkZGl0aW9ucyBvZiB0aGUgJ2NvbXBhcmlzb24nIGZhY3RvciBpbXByb3ZlIGZpdC4gCgojIyBHcmF2aXR5CgojIyMgVGFibGUKCkdyYXZpdHksIGdyYWRlZCBqdWRnbWVudDogcHJlZGljdCB0YWJsZSB1cCB2IGRvd24gPiBkb3duIHYgY29udGludWUgPiB1cCB2IGNvbnRpbnVlLiBJcyBlYWNoIHBhaXJ3aXNlIGNvbXBhcmlzb24gc2lnbmlmaWNhbnQ/CgpNZXRob2Q6IEZpbHRlciB0byBlYWNoIHBhaXJ3aXNlIGNvbXBhcmlzb24sIGFzayB3aGV0aGVyIGluY2x1ZGluZyB0aGUgY29tcGFyaXNvbiB0eXBlIChlLmcuIHVwL2Rvd24gdnMgdXAvY29udGludWUpIGltcHJvdmVzIG1vZGVsIGZpdC4gCgpUQUJMRSBldmVudCBkb2Vzbid0IGV4aXN0IGluIHRoZSBwaWxvdCBzZXQsIHNvIHRyeSB0aGlzIHdpdGggdHdvIGV4YW1wbGVzIGZyb20gdGhlICdmYWxsJyBldmVudCBpbnN0ZWFkOgoKYGBge3IgZWNobz1GQUxTRX0KI01vZGVsIChTdGFydCB3aXRoIHRoZSBzYW1lICdzdXJwcmlzaW5nbmVzcycgYmFzZSBtb2RlbCBmb3IgdGhlIGV2ZW50IGFzIGFib3ZlKQoKZmFsbF9tb192c19uZWFyIDwtIGZpbHRlcihmYWxsLCBjb21wYXJpc29uID09ICJtb3N0bHktb246bmVhciIgfCBjb21wYXJpc29uID09ICJtb3N0bHktb246c2xpZ2h0bHktb24iKQoKZml0YmV0YV9mYWxsX21vX3ZzX25lYXIgPC0gZ2xtbVRNQihmcmFjTGVmdF90ciB+IGxlc3NFeHBlY3RlZExlZnQqYWdlUmVnaXN0cmF0aW9uKnRyaWFsbnVtICsgKDF8c2hvcnRJZCkgKyAoMXxzdGltdWxpKSwgZGF0YSA9IGZhbGxfbW9fdnNfbmVhciwgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGFfZmFsbF9tb192c19uZWFyKQoKI0FkZCBjb21wYXJpc29ucyBhcyBhIGZhY3RvcgpmaXRiZXRhX2ZhbGxfbW9fdnNfbmVhcl9jb21wYXJpc29ucyA8LSBnbG1tVE1CKGZyYWNMZWZ0X3RyIH4gY29tcGFyaXNvbipsZXNzRXhwZWN0ZWRMZWZ0KmFnZVJlZ2lzdHJhdGlvbip0cmlhbG51bSArICgxfHNob3J0SWQpICsgKDF8c3RpbXVsaSksIGRhdGEgPSBmYWxsX21vX3ZzX25lYXIsIGZhbWlseSA9IGJldGFfZmFtaWx5KGxpbmsgPSAibG9naXQiKSkKc3VtbWFyeShmaXRiZXRhX2ZhbGxfbW9fdnNfbmVhcl9jb21wYXJpc29ucykKCiNUaGlzIG1vZGVsIGRvZXNuJ3QgY29udmVyZ2UgKCJOQS9OYU4gZnVuY3Rpb24gZXZhbHVhdGlvbiIpISBXaGF0J3MgdGhlIGJhY2t1cCBwbGFuPyAKYGBgCgpRVUVTVElPTiBGT1IgUEFUUklDSzogVGhlc2UgbW9kZWxzIGRvbid0IGNvbnZlcmdlLCBhbmQgSSdtIG5vdCBzdXJlIHRoZSBjb3JyZWN0IHByb2NlZHVyZSBmb3IgcHJvY2VlZGluZyBpbiB0aGlzIGNhc2UhCgojIyMgVG9zcywgUmFtcAoKKE5vIHdpdGhpbi1ldmVudCB0ZXN0cykKCiMjIEluZXJ0aWEKCiMjIyBTdG9wLCBSZXZlcnNlCgooTm8gd2l0aGluLWV2ZW50IHRlc3RzKQoKIyMgU3VwcG9ydAoKIyMjIFN0YXkvRmFsbAoKUVVFU1RJT04gRk9SIFBBVFJJQ0sgKHRoaXMgd2hvbGUgc2VjdGlvbikKCkNvbXBhcmlzb25zIGFyZSB0aGVvcmV0aWNhbGx5IHBhaXJlZCBhY3Jvc3MgdGhlIHN0YXkvZmFsbCBkaXN0aW5jdGlvbi4gU3BlY2lmaWNhbGx5LCB3ZSBleHBlY3QgZWFjaCBjb21wYXJpc29uIHRvICphbnRpY29ycmVsYXRlKiBhY3Jvc3MgdGhlIHN0YXkvZmFsbCBkaXN0aW5jdGlvbi4gQWRkaXRpb25hbGx5LCB3ZSBleHBlY3QgdGhhdCBkaWZmZXJlbnQgY29tcGFyaXNvbnMgc2hvdWxkICdjb21lIG9ubGluZScgYXQgZGlmZmVyZW50IHBvaW50cy4KClRoZSBnb2FsIGhlcmUgaXMgdG8gZGVmaW5lIGEgbW9kZWwgdGhhdCBjYW4gc3VwcG9ydCBhc2tpbmcgdGhlc2UgcXVlc3Rpb25zLiBNeSBiZXN0IGd1ZXNzIGF0IHRoaXMgbW9kZWwgd291bGQgYmU6CgpgYGB7cn0Kc3VwcG9ydCA8LSBiaW5kX3Jvd3Moc3RheSwgZmFsbCkKCiNPcmlnaW5hbCAnc3VycHJpc2luZ25lc3MnIG1vZGVsCmZpdGJldGFfc3VwcG9ydCA8LSBnbG1tVE1CKGZyYWNMZWZ0X3RyIH4gbGVzc0V4cGVjdGVkTGVmdCphZ2VSZWdpc3RyYXRpb24qdHJpYWxudW0gKyAoMXxzaG9ydElkKSArICgxfHN0aW11bGkpLCBkYXRhID0gc3VwcG9ydCwgZmFtaWx5ID0gYmV0YV9mYW1pbHkobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KGZpdGJldGFfc3VwcG9ydCkKCiMgQWRkIGV2ZW50L2NvbXBhcmlzb24gdGVybXMKCmZpdGJldGFfc3VwcG9ydF9jb21wYXJpc29ucyA8LSBnbG1tVE1CKGZyYWNMZWZ0X3RyIH4gYWdlUmVnaXN0cmF0aW9uKmxlc3NFeHBlY3RlZExlZnQqZXZlbnQqY29tcGFyaXNvbiArIGFnZVJlZ2lzdHJhdGlvbip0cmlhbG51bSArICgxfHNob3J0SWQpICsgKDF8c3RpbXVsaSksIGRhdGEgPSBzdXBwb3J0LCBmYW1pbHkgPSBiZXRhX2ZhbWlseShsaW5rID0gImxvZ2l0IikpCnN1bW1hcnkoZml0YmV0YV9zdXBwb3J0X2NvbXBhcmlzb25zKQoKI1RoaXMgZG9lc24ndCBjb252ZXJnZSEKYGBgCgpPbmNlIHNwZWNpZmllZCwgd2UnZCBsaWtlIHRvIGFzayB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczoKCi0gSXMgaXQgdGhlIGNhc2UgdGhhdCBwcmVkaWN0aW9ucyBmb3IgU1RBWSBldmVudHMgJ2FudGkgY29ycmVsYXRlJyB3aXRoIEZBTEwgZXZlbnRzPwoKLSBJbnR1aXRpdmUgYXBwcm94aW1hdGUgbWFnbml0dWRlIG9yZGVyaW5nIGJhc2VkIG9uIGFkdWx0IHVuZGVyc3RhbmRpbmcgb2YgcGh5c2ljczogbW9zdGx5LW5lYXIsIG1vc3RseS1uZXh0LCBtb3N0bHktc2xpZ2h0bHksIHNsaWdodGx5LW5lYXIsIHNsaWdodGx5LW5leHQsIG5leHQtbmVhci4gV2hhdCBvcmRlcnMgZG8gd2UgYWN0dWFsbHkgc2VlIHcvaSBraWRzPwoKClFVRVNUSU9OOiBGT1IgUEFUUklDSzogSSdkIGxpa2UgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgcGxhbm5lZCBjb21wYXJpc29uIG9mIHRoZXNlIG9yZGVyaW5ncywgYnV0IEknbSBub3Qgc3VyZSBob3chIChJRSBpZiBJJ2QgbGlrZSB0byBjb21wYXJlIHRoZSBtb2RlbCBmaXRzIHRvIHNvbWV0aGluZyBsaWtlICJtZWFucyBhcmUgYXQgWzEgMSAxIDAuNSAwLjUgMC41XSIsIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoYXQgcHJlZGljdGlvbi4pCgpIWVBPVEhFU0lTIFNVR0dFU1RJT05TIEZST00gS0lNOiBTdGFnZSB0aGVvcnk6IE1pZ2h0IG1ha2UgY3J1ZGUgcHJlZGljdGlvbnMgYmFzZWQgb24gd2hpY2ggc2hvdWxkIHN0YXkgdnMuIGZhbGzigJRpZiBvbmx5IG1vc3RseS1vbiBzaG91bGQgc3RheSBwdXQsIHRoZW4gbW9zdGx5LXNsaWdodGx5LCBtb3N0bHktbmV4dCwgbW9zdGx5LW5lYXIgYXJlIGJpZ2dlciBkaWZmZXJlbmNlcyBhbmQgbWlnaHQgc2hvdyBiaWdnZXIgcHJlZmVyZW5jZXMgdGhhbiB0aGUgb3RoZXJzLCBzaW5jZSBpbiB0aGVzZSBjYXNlcyB3ZSBoYXZlIG9uZSDigJxleHBlY3RlZOKAnSBhbmQgb25lIOKAnHVuZXhwZWN0ZWTigJ0gb3V0Y29tZS4gSWYgbW9zdGx5LW9uIGFuZCBzbGlnaHRseS1vbiBib3RoIHN0YXkgcHV0LCB0aGVuIGV4cGVjdCBpbnN0ZWFkIG1vc3RseS1uZXh0LCBtb3N0bHktbmVhciwgc2xpZ2h0bHktbmV4dCwgc2xpZ2h0bHktbmVhciB0byBzaG93IGJpZ2dlciBwcmVmZXJlbmNlcyB0aGFuIHRoZSBvdGhlcnMuIEV0Yy4gUHJvamVjdCBwcmVmZXJlbmNlIHZlY3RvcnMgb250byBbMSwxLDEsMCwwLDBdLCBbMCwxLDEsMCwxLDFdLCBbMCwwLDAsMSwxLDFdIGFuZCBwbG90IHRyYW5zZm9ybWVkIGNvb3JkcyBieSBhZ2UsIHdoZXJlIHRyYW5zZm9ybWVkIGNvb3JkcyBiYXNpY2FsbHkgcmVwcmVzZW50IOKAnGhvdyBtdWNoIGxpa2UgYSBwYXJ0aWFsLXN1cHBvcnQta25vd2VyIGRvIHlvdSBhY3Qs4oCdIOKAnGhvdyBtdWNoIGxpa2UgYW4gYW55LXN1cHBvcnQtZnJvbS1iZWxvdy1rbm93ZXIgZG8geW91IGFjdCzigJ0g4oCcaG93IG11Y2ggbGlrZSBhbiBhbnktY29udGFjdC1pcy1zdXBwb3J0LWtub3dlciBkbyB5b3UgYWN0LuKAnSBPdmVyYWxsLCBhY3Jvc3Mga2lkcywgd2hhdCBwcmVmZXJlbmNlIHZlY3RvcnMgZG8gd2Ugc2VlLCBiaW5uZWQgYnkgYWdlIGdyb3VwPyAocGxvdCBtZWFuIHZlY3RvcnMgb3ZlciB0aW1lPykgQ291bGQgaW1hZ2luZSBnZXR0aW5nIGNsb3NlciB0byBbMSwxLDEsMCwwLDBdIGFzIGFib3ZlIG9yIGdldHRpbmcgYmV0dGVyIG9uIGV2ZXJ5dGhpbmcsIGV2ZW4gdGhlIG9uZXMgdGhhdCBhcmVu4oCZdCBkaXNwYXJhdGUgb24gcG9zc2liaWxpdHkgKGkuZS4gbWlnaHQgZXhwZWN0IGEgYmFieSB3aG8g4oCccmVhbGx5IGdldHMgaXTigJ0gdG8gbm90IGNhcmUgYWJvdXQgc29tZXRoaW5nIHN0YXlpbmcgaW4gbWlkYWlyIHZzLiBzdGF5aW5nIHdoZW4gcGxhY2VkIG5leHQgdG8gYSBjYWJpbmV0LCBiZWNhdXNlIHRoZXnigJlyZSBib3RoIG9idmlvdXNseSBpbXBvc3NpYmxlOyBPUiBtaWdodCBleHBlY3QgYSBiYWJ5IHdobyDigJxyZWFsbHkgZ2V0cyBpdOKAnSB0byBkaWZmZXJlbnRpYXRlIGV2ZW4gdGhpcyBzdWJ0bGUgZGlmZmVyZW5jZSBpbiBwcm9iYWJpbGl0eSBiZWNhdXNlIGhleSwgbWF5YmUgaXTigJlzIGEgc3RpY2t5IHRhYmxlIG9yIG15IHBlcmNlcHRpb24gaXMgbm9pc3kgb3Igc29tZXRoaW5nLiBOb3RoaW5nIGluIEJhaWxsYXJnZW9uIHN0YWdlIHRoZW9yeSBwcmVkaWN0cyBnZXR0aW5nIGJldHRlciBhdCB0aGlzIGNvbXBhcmlzb24gd2l0aCBhZ2UsIHNvIGl04oCZcyBhIG5pY2UgdGVzdC4KCgojIyAnTG9va2luZyBwZXJzb25hbGl0aWVzJwoKU2VwYXJhdGUgZnJvbSB0aGUgcXVlc3Rpb24gYWJvdXQgcGh5c2ljcywgd2UgY2FuIHVzZSB0aGUgJ2NvbnRyb2wnIGV2ZW50cyB0byBhc2sgYWJvdXQgdGhlIGR5bmFtaWNzIG9mIGxvb2tpbmcgdGltZSBpbiB0aGVzZSBleHBlcmltZW50cy4gRm9yIHRoZXNlLCB3ZSdsbCByZXR1cm4gdG8gdGhlIG1haW4gZGF0YXNldCBhbmQgc3BsaXQgb2ZmIHRoZSBjb250cm9sIGV2ZW50czoKCmBgYHtyfQpjb250cm9sZGF0YSA8LSBwaWxvdGRhdGEgJT4lCiAgZmlsdGVyKGV2ZW50ID09ICJzYW1lInxldmVudCA9PSAiY2FsaWJyYXRpb24ifGV2ZW50PT0ic2FsaWVuY2UiKQoKCgojS2VlcCBhbGwgdGhlIHN1YmplY3QtbGV2ZWwgdmFyaWFibGVzIHdlJ2xsIGJlIGNhcmluZyBhYm91dCEKc3ViamxldmVsIDwtIGNvbnRyb2xkYXRhICU+JQogIHNlbGVjdCgtYygidmlkZW9udW0iLCJjYWxpYnJhdGlvbiIsICJkdXJhdGlvbiIsImxlZnQiLCJvb2Z0aW1lIiwgInJpZ2h0IiwgInN0aW11bGkiLCJ0cmlhbG51bSIsImV2ZW50IiwiY29uY2VwdCIsIm9iamVjdCIsInVuZXhwZWN0ZWRMZWZ0IiwgICAgICAgICAgICAgICAidW5leHBlY3RlZFJpZ2h0IiwibGVzc0V4cGVjdGVkTGVmdCIsIm91dGNvbWVMZWZ0IiwgIm91dGNvbWVSaWdodCIsICAgICAgICAgICAgICAgICAiY29tcGFyaXNvbiIsICJmcmFjTGVmdCIsICJmcmFjTGVzc0V4cGVjdGVkIiwgImZyYWNBYnMiLCAibWV0cmljIiwgInRvdGFsTFQiLCAiY2hpbGQucHJvcXVpbnQiLCAiZnJhY0xlZnRfdHIiKSkgJT4lCiAgZ3JvdXBfYnkoc2hvcnRJZCklPiUKICBzbGljZSgxKSU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLVgpCmBgYAoKVGhlbiwgd2UnbGwgY2FsY3VsYXRlIGEgc2VyaWVzIG9mIHBlci1jaGlsZC9wZXItc2Vzc2lvbiBtZWFzdXJlczoKClNpZGUgYmlhczogZnJhY3Rpb25hbCBsb29raW5nIHRpbWUgdG8gUiBkdXJpbmcg4oCYc2FtZeKAmSBldmVudHMgKDMgZXZlbnRzL3Nlc3Npb24pIAoKYGBge3J9CnNpZGViaWFzIDwtIGNvbnRyb2xkYXRhICU+JQogIGZpbHRlcihldmVudCA9PSAic2FtZSIpJT4lCiAgZ3JvdXBfYnkoc2hvcnRJZCklPiUKICBkcGx5cjo6c3VtbWFyaXplKHNpZGViaWFzID0gMS1tZWFuKGZyYWNMZWZ0X3RyKSkKCnNpZGViaWFzID0gbWVyZ2Uoc2lkZWJpYXMsIHN1YmpsZXZlbCwgYnk9Yygic2hvcnRJZCIpKQpgYGAKClN0aWNraW5lc3M6IHxmTFQg4oCTIDAuNXwgZHVyaW5nIOKAmHNhbWXigJkgZXZlbnRzICgzIGV2ZW50cy9zZXNzaW9uKQoKYGBge3J9CnN0aWNraW5lc3MgPC0gY29udHJvbGRhdGEgJT4lCiAgZmlsdGVyKGV2ZW50ID09ICJzYW1lIiklPiUKICBncm91cF9ieShzaG9ydElkKSU+JQogIGRwbHlyOjpzdW1tYXJpemUoc3RpY2tpbmVzcyA9IGFicyhtZWFuKGZyYWNMZWZ0X3RyKS0wLjUpKQoKc3RpY2tpbmVzcyA9IG1lcmdlKHN0aWNraW5lc3MsIHN1YmpsZXZlbCwgYnk9Yygic2hvcnRJZCIpKQpgYGAKClNlbnNpdGl2aXR5OiBmTFQgdG8gbW9yZSBpbnRlcmVzdGluZyBkdXJpbmcgJ3NhbGllbmNlJyBldmVudHMgKDMgZXZlbnRzL3Nlc3Npb24pCgpgYGB7cn0KIyBzZW5zaXRpdml0eSA8LSBjb250cm9sZGF0YSAlPiUKIyAgIGZpbHRlcihldmVudCA9PSAic2FsaWVuY2UiKSU+JQojICAgbXV0YXRlKGZyYWNMZXNzRXhwZWN0ZWRfdHIpCiMgICBncm91cF9ieShzaG9ydElkKSU+JQojICAgZHBseXI6OnN1bW1hcml6ZShzZW5zaXRpdml0eSA9IG1lYW4oZnJhY0xlZnRfdHIpKQpgYGAKClRvdGFsIGxvb2tpbmcgdGltZSAoYWxsIGV2ZW50cykKCkhvdyBzdGFibGUgYXJlIGNvbnRyb2wgbWVhc3VyZXMgYWNyb3NzIHNlc3Npb25zLCBhbmQgZG8gdGhleSBjaGFuZ2Ugd2l0aCBhZ2U/ClBhcnRpdGlvbiB2YXJpYW5jZSBmb3IgZWFjaCBtZWFzdXJlOiAgbWVhc3VyZSB+IGFnZSArICgxfGNoaWxkL3Nlc3Npb24pLiAoRnJhY3Rpb24gb2YgdG90YWwgdmFyaWFuY2UgZXhwbGFpbmVkID0gaW50cmFjbGFzcyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudC4pIFJlcG9ydCBjb2VmZmljaWVudCBvZiBhZ2UgJiB0ZXN0IGZvciBzaWduaWZpY2FuY2UuCkRpc3BsYXkgb3ZlcmFsbCBkaXN0cmlidXRpb25zIG9mIHRoZXNlIG1lYXN1cmVzIChvbmUgbWVhbiBwZXIgY2hpbGQpIGFuZCBwbG90IG1lYXN1cmVzIGFnYWluc3Qgc2Vzc2lvbnMgKGUuZy4sIG9uZSBsaW5lIHBlciBjaGlsZCkKCiMjIyBNb29kCgpBcmUgY29udHJvbHMgd2VsbCBwcmVkaWN0ZWQgYnkgbW9vZCBtZWFzdXJlcz8gUmVncmVzcyBlYWNoIGNvbnRyb2wgbWVhc3VyZSAodXNpbmcgbWVhbnMgcGVyIHNlc3Npb24sIGFuZCB8KG1lYW4gZkxUIHRvIHJpZ2h0KSAtIDAuNXwgZm9yIHNpZGUgYmlhcyBhcyBhIG1lYXN1cmUgb2Ygc3RyZW5ndGggb2YgYmlhcyB0byBlaXRoZXIgc2lkZSkgdXNpbmcgbW9kZWw6IG1lYXN1cmUgfiAxICsgcGFyZW50c2NvcmUgKyBjaGlsZHNjb3JlICsgY2hpbGRhY3Rpdml0eSArIHRpbWVzaW5jZXdha2luZyArIHRpbWV1bnRpbHNsZWVwICsgdHJpYWwjICsgKDF8Y2hpbGQpLiBSZXBvcnQgb3ZlcmFsbCBzaWduaWZpY2FuY2Ugb2YgbW9kZWwgKGJhc2VkIG9uIEYgdmFsdWUpIGFuZCBjb2VmZmljaWVudHMgb2YgaW5kaXZpZHVhbCBwcmVkaWN0b3JzLiBQcmVkaWN0b3JzOgpQYXJlbnQgc2NvcmU6IG1lYW4gb2Ygei1zY29yZWQgcGFyZW50IGl0ZW1zCkNoaWxkIHNjb3JlOiBtZWFuIG9mIHotc2NvcmVkIGNoaWxkIGl0ZW1zIHJlc3RlZCwgaGVhbHRoeSwgaGFwcHkKQ2hpbGQgYWN0aXZpdHk6IGNhbG0tYWN0aXZlIHNjb3JlClRpbWUgc2luY2Ugd2FraW5nIHVwClRpbWUgdW50aWwgZHVlIGZvciBzbGVlcCAo4oCcb3ZlcmR1ZeKAnSA9IDAsIOKAnG5vIHNjaGVkdWxl4oCdID0gbWlzc2luZyBkYXRhLikKCiMjIyBMb29raW5nIFBlcnNvbmFsaXRpZXMgeCBUZXN0IEVmZmVjdHMKCkhvdyB3ZWxsIGRvZXMgc2lkZSBiaWFzIGR1cmluZyBjb250cm9sIHN0aW11bGkgcHJlZGljdCBzaWRlIGJpYXMgZHVyaW5nIHRlc3RzPyBzYl90ZXN0IH4gc2JfY29udHJvbCArICgxfGNoaWxkKS4gVXNlIG1lYW4gbG9va2luZyB0aW1lIHRvIHJpZ2h0IGFjcm9zcyBhbGwgc2FtZS90ZXN0IHRyaWFscyBpbiBhIHNlc3Npb24gKHNiX2NvbnRyb2wgaW5jbHVkZXMgdXAgdG8gMyDigJhzYW1l4oCZIHRyaWFscywgc2JfdGVzdCBpbmNsdWRlcyBhbGwgb3RoZXIgdHJpYWxzIGV4Y2VwdCBjYWxpYnJhdGlvbikuIFJlcG9ydCBjb2VmZmljaWVudCAmIHRlc3QgZm9yIHNpZ25pZmljYW5jZSBvZiBzYl9jb250cm9sLgoKSG93IHdlbGwgZG9lcyBzZW5zaXRpdml0eSBjb250cm9sIHByZWRpY3QgZkxUIG9uIGV2ZW50cz8gZkxUIH4gc2Vuc2l0aXZpdHkgKyAoMXxjaGlsZCkuIE9uZSBtZWFuIGZMVCB2YWx1ZSBwZXIgc2Vzc2lvbiwgaW5jbHVkaW5nIGFsbCB0ZXN0cyB3aXRoIHVuYW1iaWd1b3VzIGV4cGVjdGVkIG91dGNvbWUgdG8gYWR1bHRzIChleGNsdWRpbmcgY2FsaWJyYXRpb24sIHNhbWUsIHRhYmxlIHVwLWNvbnRpbnVlLCBzdGF5L2ZhbGwgd2l0aG91dCBtb3N0bHktb24gYXMgb25lIG9mIHRoZSBvdXRjb21lcykuIFJlcG9ydCBjb2VmZmljaWVudCAmIHRlc3QgZm9yIHNpZ25pZmljYW5jZSBvZiBzZW5zaXRpdml0eS4KCkhvdyB3ZWxsIGRvZXMgc3RpY2tpbmVzcyBwcmVkaWN0IG5vaXNpbmVzcyBvZiBkYXRhPyB2YXJpYW5jZV9zYWxpZW5jZSB+IHN0aWNraW5lc3MgKyAoMXxjaGlsZCkuIFJlcG9ydCBjb2VmZmljaWVudCAmIHRlc3QgZm9yIHNpZ25pZmljYW5jZSBvZiBzdGlja2luZXNzLgoKSG93IHN0YWJsZSBhcmUga2lkc+KAmSBsb29raW5nIHBhdHRlcm5zIG9uIHRlc3Qgc3RpbXVsaSBhY3Jvc3Mgc2Vzc2lvbnM/IEhvdyBtdWNoIGRvIHRoZSBzcGVjaWZpYyB2aWRlb3MgKGUuZy4gb2JqZWN0IGNob2ljZXMsIGJhY2tncm91bmRzKSBtYXR0ZXIgaW4gY29tcGFyaXNvbiB0byB0aGUgZXZlbnQgdHlwZXM/CmZMVF90cmlhbCB+IGNvbmNlcHQvZXZlbnQvY29tcGFyaXNvbiArIGNvbmNlcHQ6ZXZlbnQ6Y29tcGFyaXNvbjpvYmplY3QgKyBjb25jZXB0OmV2ZW50OmNvbXBhcmlzb246b2JqZWN0OmNhbWVyYWFuZ2xlICsgY29uY2VwdDpldmVudDpjb21wYXJpc29uOm9iamVjdDpiYWNrZ3JvdW5kICsgY29uY2VwdDpldmVudDpjb21wYXJpc29uOm9iamVjdDpmbGlwICsgdHJpYWwjICsgKDF8Y2hpbGQvY29tcGFyaXNvbikgKyAoMXxjaGlsZDpzZXNzaW9uKS4gUmVwb3J0IGZyYWN0aW9uIHZhcmlhbmNlIGV4cGxhaW5lZCBieSBjaGlsZC9jb21wYXJpc29uICYgYnkgc2Vzc2lvbiwgY29lZmZpY2llbnQgZm9yIHRyaWFsIyB3aXRoIHNpZ25pZmljYW5jZSwgYW5kIHVzZSBBTk9WQSB0byByZXBvcnQgb3ZlcmFsbCBlZmZlY3RzIG9mIG9iamVjdCwgY2FtZXJhIGFuZ2xlLCBiYWNrZ3JvdW5kLCAmIGZsaXAgYWNyb3NzIGNoaWxkcmVuLgpEbyBwcmVmZXJlbmNlcyBjaGFuZ2Ugb3ZlciB0aGUgY291cnNlIG9mIHRoZSAxNSBzZXNzaW9ucywgYWNyb3NzIGNoaWxkcmVuPyBmTFRfdHJpYWwgfiBjb25jZXB0L2V2ZW50L2NvbXBhcmlzb24gKyB0cmlhbCMgKyBzZXNzaW9uIyArICgxfGNoaWxkL2NvbXBhcmlzb24pLiBSZXBvcnQgY29lZmZpY2llbnQgZm9yIHNlc3Npb24jIGFuZCB0ZXN0IGZvciBzaWduaWZpY2FuY2UuCgoKCiMjIyBTdW1tYXJ5IENhbGN1bGF0aW9ucyBmb3IgZnV0dXJlIHN0dWRpZXMKCihHdWlkYW5jZSBmb3IgZnV0dXJlIHN0dWRpZXMsIG5vdCBzcGVjaWZpYyBoeXBvdGhlc2VzIGFib3V0IHBoeXNpY3MvbG9va2luZyBwZXJzb25hbGl0aWVzKQoKU3VtbWFyeSBvZiBjaGlsZHJlbuKAmXMgcHJlZmVyZW5jZXMgb24gdGhlc2UgZXZlbnRzOgoKQmluIHRvZ2V0aGVyIGVhY2ggY29tcGFyaXNvbiB0eXBlIChlYWNoIHBoeXNpY3MgY29tcGFyaXNvbiArIHNhbGllbmNlIGNvbnRyb2wpLCBhbGwgbWVhc3VyZW1lbnRzIHBlciBjaGlsZC4gU2VwYXJhdGVseSBiaW4gYnkgY29uY2VwdCAoZ3Jhdml0eSwgc3VwcG9ydCwgaW5lcnRpYSkuIEFkZCB0b3RhbCB0aW1lIGxvb2tpbmcgYXQgdGFyZ2V0IGFuZCBkaXN0cmFjdG9yIGFjcm9zcyBhbGwgdHJpYWxzIHRvIGdldCBhbiBmTFQgbWVhc3VyZW1lbnQuCgpCb290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgcGVyIGNoaWxkIGJ5IHJlc2FtcGxpbmcgc2Vzc2lvbnMsIHRoZW4gdHJpYWxzLiAKCldoYXQgZnJhY3Rpb24gb2YgY2hpbGRyZW4gaGF2ZSBhIHByZWZlcmVuY2UgZm9yIGVpdGhlciB0aGUgZXhwZWN0ZWQgb3IgdW5leHBlY3RlZCBldmVudCB3aXRoIDk1JSBDSSBub3Qgb3ZlcmxhcHBpbmcgNTAlIGxvb2tpbmcsIGZvciBlYWNoIGdyb3VwaW5nPyAoSnVzdCBpbmZvcm1hdGl2ZSBmb3IgZGVzaWduIG9mIGZ1dHVyZSBzdHVkaWVzIC0gaG93IG11Y2ggZGF0YSBkbyB5b3UgbmVlZCB0byBzZWUgaW5kaXZpZHVhbCBwcmVmZXJlbmNlcz8gTWF5IGFsc28gd2FudCB0byBjYWxjdWxhdGUgZm9yIHNtYWxsZXIgc3Vic2V0cyBvZiB0aGUgZGF0YSwgZS5nLiBob3cgbWFueSBzZXNzaW9ucyB1bnRpbCBYJSBjaGlsZHJlbiBzaG93IGluZGl2aWR1YWxseS1zaWduaWZpY2FudCByZXN1bHRzIHdoZW4gZ3JvdXAtbGV2ZWwgZWZmZWN0IHNpemUgaXMgWS4pCgoKPCEtLSBPTEQgQ09ERSBCRUxPVyBIRVJFIC0tPgoKPCEtLSAjIENvbnN0cnVjdCAnZHVtbXknIGRhdGEgd2l0aCBzb21lIGJhc2ljIGV4cGVjdGVkIGNoYXJhY3RlcmlzdGljcyAtLT4KPCEtLSBDcmVhdGUgc2ltdWxhdGVkIGRhdGEgZm9yIDEyIHNlc3Npb25zISBXZSBkbyB0aGlzIGJ5IGp1c3QgZHVwbGljYXRpbmcgdGhlIGRhdGFzZXQgd2l0aCBpbmNyZWFzaW5nIChlcXVhbCkgc2xvcGUgdG93YXJkIGZyYWNMZXNzRXhwZWN0ZWQgPSAxIChmdWxsIGF0dGVudGlvbiB0b3dhcmQgbW9zdCBzdXJwcmlzaW5nLCBmcm9tIGFkdWx0IHBlcnNwZWN0aXZlKSwgYW5kIGluY3JlYXNpbmcgYWdlcyBieSBhIGZldyBkYXlzIGF0IGEgdGltZS4gRm9yIGl0ZW1zIHdoZXJlIGxlc3NFeHBlY3RlZCBpcyB1bmRlZmluZWQsIHdlIGFkZCBhIGJpdCBvZiBub2lzZSBidXQgbGVhdmUgYWxvbmUuIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gI0tleSBjb2x1bW5zIC0tPgo8IS0tICMgc2hvcnRJZCAtIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgKHV1aWQpIC0tPgo8IS0tICMgcHJvcXVpbnQgLSByZWFkYWJsZSBJRCwgaW4gY2FzZSB3ZSB3YW50IHRvIGV4YW1pbmUgY2FzZXMgLS0+CjwhLS0gIyBhZ2VSZWdpc3RyYXRpb24gLSBjaGlsZCBhZ2UgaW4gbW9udGhzICsgZnJhY3Rpb25hbCBtb250aHMgLS0+CjwhLS0gIyBzdGltdWxpIC0gc3RpbXVsdXMgaWRlbnRpZmllciAtLT4KPCEtLSAjIHRyaWFsbnVtIC0gdHJpYWwgbnVtYmVyIC0tPgo8IS0tICMgY29tcGFyaXNvbiAtIHNwZWNpZmljIGNvbXBhcmlzb24gaW4gcGh5c2ljcyBjb25jZXB0IChlLmcuICJvbiB2cy4gbmVhciIpIC0tPgo8IS0tICMgZXZlbnQgLSBwaHlzaWNzIGV2ZW50IChyYW1wLCBldGMpIC0tPgo8IS0tICMgY29uY2VwdCAtIHBoeXNpY3MgZXZlbnQgKmNhdGVnb3J5KiAobHVtcHMgYSBmZXcgZXZlbnRzIHRvZ2V0aGVyKSAtLT4KPCEtLSAjIGxlc3NFeHBlY3RlZExlZnQgLSBsb2NhdGlvbiBvZiB0aGUgbGVzcyBleHBlY3RlZCB2ZXJzaW9uICh1bmRlZmluZWQgZm9yIGl0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIGxlc3MgZXhwZWN0ZWQgdmVyc2lvbiEpIC0tPgo8IS0tICMgZnJhY0xlc3NFeHBlY3RlZCAtIEZyYWN0aW9uYWwgbG9va2luZyB0aW1lIHRvIHRob3NlIHRyaWFscyAodW5kZWZpbmVkIGZvciBpdGVtcyB0aGF0IGRvbid0IGhhdmUgYSBsZXNzIGV4cGVjdGVkIHZlcnNpb24pIC0tPgo8IS0tICMgdG90YWxMVCAtIFRvdGFsIHRyaWFsIHRpbWUgaW4gY2FzZSB3ZSB3YW50IHRvIHJlY292ZXIgdGhhdCEgLS0+Cgo8IS0tICMgQ29uc3RydWN0IHNpbXVsYXRlZCBkYXRhIChOb3RlLCB3ZSBjYW4gbWFrZSB0aGlzIG1vcmUgY29tcGxpY2F0ZWQgb3ZlciB0aW1lKSAtLT4KPCEtLSAjIEZvciBub3csIGl0IGFzc3VtZXMgdGhhdCBmcmFjTGVzc0V4cGVjdGVkIHZhbHVlcyBqdXN0IGdldCBoaWdoZXIgd2l0aCBzZXNzaW9ucywgb24gc2xvcGVzIC0tPgo8IS0tICMgZGV0ZXJtaW5lZCBzZW1pIHJhbmRvbWx5IGZvciBlYWNoIGNoaWxkL2NvbmNlcHQsIGFuZCB0aGF0IGFnZXMgZ2V0IG9sZGVyIG9uIGEgc2xpZ2hseSByYW5kb20gc2NoZWR1bGUgLS0+Cgo8IS0tIHNpbXVsYXRlZF8xMnNlc3Npb25fZGF0YSA8LSBwaWxvdGRhdGEgJT4lIC0tPgo8IS0tICAgZmlsdGVyKCFpcy5uYShmcmFjTGVzc0V4cGVjdGVkKSklPiUgLS0+CjwhLS0gICBncm91cF9ieShzaG9ydElkLCBjb25jZXB0KSAlPiUgLS0+CjwhLS0gICBkcGx5cjo6c3VtbWFyaXplKHN0YXJ0TWVhbl9zaW0gPSBtZWFuKGZyYWNMZXNzRXhwZWN0ZWQpLCBzbG9wZV9zaW0gPSBhYnMocm5vcm0oMSwwLjA1LDAuMDEpKSwgc3RhcnRBZ2UgPSBtZWFuKGFnZVJlZ2lzdHJhdGlvbikpICU+JSNTbWFsbCwgdXN1YWxseSBwb3NpdGl2ZSBzbG9wZXMgLS0+CjwhLS0gICB1bmNvdW50KDEyLCAuaWQgPSAnc2Vzc2lvbicpICU+JSAtLT4KPCEtLSAgIGxlZnRfam9pbihmaWx0ZXIocGlsb3RkYXRhLCAhaXMubmEoZnJhY0xlc3NFeHBlY3RlZCkpKSAlPiUgLS0+CjwhLS0gICBtdXRhdGUoc2ltX2ZyYWNMZXNzRXhwZWN0ZWQgPSBzdGFydE1lYW5fc2ltICsgKHNlc3Npb24tMSkqc2xvcGVfc2ltICsgcm5vcm0oMSwwLCAwLjAxKSkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKHNpbV9mcmFjTGVzc0V4cGVjdGVkID0gaWZlbHNlKHNpbV9mcmFjTGVzc0V4cGVjdGVkIDwgMSwgc2ltX2ZyYWNMZXNzRXhwZWN0ZWQsIDEpKSAlPiUgLS0+CjwhLS0gICBtdXRhdGUoc2ltX2FnZSA9IHN0YXJ0QWdlICsgKHNlc3Npb24tMSkqYWJzKHJub3JtKDEsMC4yNSwwLjUpKSkgI0F2ZXJhZ2UgMSB3ZWVrIGJldHdlZW4gc2Vzc2lvbnMsIG5vIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyAtLT4KCjwhLS0gc2ltdWxhdGVkXzEyc2Vzc2lvbl9kYXRhIDwtIHBpbG90ZGF0YSAlPiUgLS0+CjwhLS0gICBmaWx0ZXIoaXMubmEoZnJhY0xlc3NFeHBlY3RlZCkpJT4lIC0tPgo8IS0tICAgZ3JvdXBfYnkoc2hvcnRJZCwgY29uY2VwdCkgJT4lIC0tPgo8IS0tICAgZHBseXI6OnN1bW1hcml6ZShzdGFydE1lYW5fc2ltID0gbWVhbihmcmFjTGVzc0V4cGVjdGVkKSwgc2xvcGVfc2ltID0gYWJzKHJub3JtKDEsMC4wNSwwLjAxKSksIHN0YXJ0QWdlID0gbWVhbihhZ2VSZWdpc3RyYXRpb24pKSAlPiUjU21hbGwsIHVzdWFsbHkgcG9zaXRpdmUgc2xvcGVzIC0tPgo8IS0tICAgdW5jb3VudCgxMiwgLmlkID0gJ3Nlc3Npb24nKSAlPiUgLS0+CjwhLS0gICBsZWZ0X2pvaW4oZmlsdGVyKHBpbG90ZGF0YSwgIWlzLm5hKGZyYWNMZXNzRXhwZWN0ZWQpKSkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKHNpbV9mcmFjTGVzc0V4cGVjdGVkID0gc3RhcnRNZWFuX3NpbSArIChzZXNzaW9uLTEpKnNsb3BlX3NpbSArIHJub3JtKDEsMCwgMC4wMSkpICU+JSAtLT4KPCEtLSAgIG11dGF0ZShzaW1fZnJhY0xlc3NFeHBlY3RlZCA9IGlmZWxzZShzaW1fZnJhY0xlc3NFeHBlY3RlZCA8IDEsIHNpbV9mcmFjTGVzc0V4cGVjdGVkLCAxKSkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKHNpbV9hZ2UgPSBzdGFydEFnZSArIChzZXNzaW9uLTEpKmFicyhybm9ybSgxLDAuMjUsMC41KSkpICNBdmVyYWdlIDEgd2VlayBiZXR3ZWVuIHNlc3Npb25zLCBubyBhbGxvdyBuZWdhdGl2ZSB2YWx1ZXMgLS0+Cgo8IS0tIGBgYCAtLT4KCgoKCjwhLS0gIyBJbml0aWFsIHZpc3VhbGl6YXRpb25zIC0gU0lNVUxBVEVEIERBVEEgLS0+CjwhLS0gKiBBbmQgYWdhaW4sIHdpdGggdGhlIHNpbXVsYXRlZCBkYXRhIC0tPgoKPCEtLSBgYGB7cn0gLS0+Cgo8IS0tIGNvbmNlcHRfbWVhbnNfcGVyX2NoaWxkX3Blcl9zZXNzaW9uIDwtIHNpbXVsYXRlZF8xMnNlc3Npb25fZGF0YSAlPiUgLS0+CjwhLS0gICBmaWx0ZXIoIWlzLm5hKGZyYWNMZXNzRXhwZWN0ZWQpKSU+JSAtLT4KPCEtLSAgIGdyb3VwX2J5KHNob3J0SWQsIGNvbmNlcHQsIHNlc3Npb24pICU+JSAtLT4KPCEtLSAgIHN1bW1hcmlzZShmTEUgPSBtZWFuKHNpbV9mcmFjTGVzc0V4cGVjdGVkKSwgYWdlID0gZmlyc3Qoc2ltX2FnZSkpIC0tPgoKPCEtLSBnIDwtIGdncGxvdChjb25jZXB0X21lYW5zX3Blcl9jaGlsZF9wZXJfc2Vzc2lvbiwgYWVzKHkgPSBmTEUsIHggPSBjb25jZXB0KSkgKyAtLT4KPCEtLSAgIGdlb21fYm94cGxvdCgpICsgLS0+CjwhLS0gICAjZmFjZXRfd3JhcCh+c2Vzc2lvbikgKyAgLS0+CjwhLS0gICAjZ2VvbV9wb2ludChhbHBoYSA9IDAuMDUpICsgLS0+CjwhLS0gICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSkgKyAtLT4KPCEtLSAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpKyAtLT4KPCEtLSAgIGdndGl0bGUoJ1NJTVVMQVRFRCAtIGdyYW5kIG1lYW5zIHBlciBjb25jZXB0JykgLS0+CjwhLS0gZyAtLT4KPCEtLSBgYGAgLS0+CgoKCjwhLS0gKiBHcmFwaGluZyBieSBhZ2UsIGVhY2ggZXZlbnQgdHlwZSBzZXBhcmF0ZWx5LiAoVGhpcyBsb29rcyBzaWxseSBiZWNhdXNlIHRoZSBkYXRhIGlzIHNpbXVsYXRlZCAtIGFnZSBhbmQgYXR0ZW50aW9uIHRvIGZMRSBmb3IgYWxsIGNvbmNlcHRzIGJvdGggc2V0IHRvIGluY3JlYXNlIHN0ZXB3aXNlKSAtLT4KCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBjb25jZXB0X21lYW5zX3Blcl9jaGlsZF9wZXJfc2Vzc2lvbiA8LSBzaW11bGF0ZWRfMTJzZXNzaW9uX2RhdGEgJT4lIC0tPgo8IS0tICAgZ3JvdXBfYnkoc2hvcnRJZCwgc2Vzc2lvbiwgY29uY2VwdCkgJT4lIC0tPgo8IS0tICAgc3VtbWFyaXNlKGZMRSA9IG1lYW4oc2ltX2ZyYWNMZXNzRXhwZWN0ZWQpLCBhZ2UgPSBmaXJzdChzaW1fYWdlKSkgLS0+Cgo8IS0tIGcgPC0gZ2dwbG90KGNvbmNlcHRfbWVhbnNfcGVyX2NoaWxkX3Blcl9zZXNzaW9uLCBhZXMoeSA9IGZMRSwgeCA9IGFnZSkpICsgLS0+CjwhLS0gICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSkgKyAtLT4KPCEtLSAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKyAtLT4KPCEtLSAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpKyAtLT4KPCEtLSAgIGZhY2V0X3dyYXAofmNvbmNlcHQpICsgIC0tPgo8IS0tICAgZ2d0aXRsZSgnTWVhbnMgYnkgYWdlJykgLS0+CjwhLS0gZyAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICogR3JhcGhpbmcgd2l0aGluIGNvbmNlcHRzLCBlLmcuICdzdGF5JyAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tICMgIC0tPgo8IS0tICMgc3RheV9tZWFuc19wZXJfY2hpbGRfcGVyX2NvbXBhcmlzb24gPC0gc2ltdWxhdGVkXzEyc2Vzc2lvbl9kYXRhICU+JSAtLT4KPCEtLSAjICAgZmlsdGVyKGV2ZW50ID09ICdzdGF5JykgJT4lIC0tPgo8IS0tICMgICBncm91cF9ieShzaG9ydElkLCBzZXNzaW9uLCBjb21wYXJpc29uKSAlPiUgLS0+CjwhLS0gIyAgIHN1bW1hcmlzZShmTEUgPSBtZWFuKHNpbV9mcmFjTGVzc0V4cGVjdGVkKSwgYWdlID0gZmlyc3Qoc2ltX2FnZSkpIC0tPgo8IS0tICMgIC0tPgo8IS0tICMgZyA8LSBnZ3Bsb3Qoc3RheV9tZWFuc19wZXJfY2hpbGRfcGVyX2NvbXBhcmlzb24sIGFlcyh5ID0gZkxFLCB4ID0gYWdlKSkgKyAtLT4KPCEtLSAjICAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjEpICsgLS0+CjwhLS0gIyAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKyAtLT4KPCEtLSAjICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNSwgbGluZXR5cGUgPSAnZGFzaGVkJykrIC0tPgo8IS0tICMgICBmYWNldF93cmFwKH5jb21wYXJpc29uKSArICAtLT4KPCEtLSAjICAgZ2d0aXRsZSgnU3RheScpIC0tPgo8IS0tICMgZyAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSAjIFRoZW4sIGJ1aWxkIHVwIHRoZSBtb2RlbHMgLS0+Cgo8IS0tIEFuIGVmZmVjdCBvZiB0cmlhbCBudW1iZXIgb24gVE9UQUwgbG9va2luZyB0aW1lIChwcmVkaWN0aW9uOiBjaGlsZHJlbiB3aWxsIGxvb2sgbGVzcyAtIHRvdGFsTFQgLSBvdmVyIHRpbWUpIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBtIDwtIGxtZSh0b3RhbExUIH4gdHJpYWxudW0sIGRhdGEgPSBzaW11bGF0ZWRfMTJzZXNzaW9uX2RhdGEsIHJhbmRvbSA9IH4gMSB8IHNob3J0SWQpICMgTE1FIG1vZGVsLCBncm91cGluZyBieSBwYXJ0aWNpcGFudCAtLT4KPCEtLSAjIHN1bW1hcnkobSkgLS0+CjwhLS0gIyAgLS0+CjwhLS0gIyBtIDwtIGxtZXIodG90YWxMVCB+IHRyaWFsbnVtICsgKDEgfCBzaG9ydElkKSwgZGF0YSA9IHNpbXVsYXRlZF8xMnNlc3Npb25fZGF0YSkgIyBMTUUgbW9kZWwsIGdyb3VwaW5nIGJ5IHBhcnRpY2lwYW50IC0tPgo8IS0tICMgc3VtbWFyeShtKSAtLT4KPCEtLSBgYGAgLS0+CgoKCjwhLS0gVGhlIGtleSBvdXRjb21lIHZhcmlhYmxlIGlzIGZyYWNMZXNzRXhwZWN0ZWQgKGZyYWN0aW9uYWwgbG9va2luZyB0aW1lIHRvIHRoZSBsZXNzLWV4cGVjdGVkIHZpZGVvIG9mIGEgcGFpcikgZm9yIGFsbCBtb2RlbHMuIEZvciBub3csIGxlYXZlIG91dCBjb21wYXJpc29ucyB3aGVyZSB0aGlzIGlzIG5vdCBkZWZpbmVkIChuZWVkIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBsYXRlcikgLS0+Cgo8IS0tIEJVVCBTRUUgYWx0ZXJuYXRlIHN0cmF0ZWd5IHByb3Bvc2VkIGJ5IEplc3NlOiBtb2RlbCBmcmFjTGVmdCwgYW5kIHRoZW4gYXNrIHdoZXRoZXIgdGhlIGZhY3RvciBvZiBpbnRlcmVzdCAoVGFyZ2V0TGVmdCkgaXMgYWZmZWN0ZWQgYnkgdGhlIHN0aW11bHVzIGNhdGVnb3JpZXMgd2UgY2FyZSBhYm91dC4gIC0tPgoKPCEtLSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbmVzdGVkIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZS4gVGhlcmUgYXJlIHR3byBraW5kcyBvZiByYW5kb20gZWZmZWN0IHdlIHdhbnQgdG8gbW9kZWw6IGNoaWxkcmVuIGFuZCBzdGltdWxpIChjaGlsZHJlbiBoYXZlIHdpdGhpbi1jb25kaXRpb24gY29tcGFyaXNvbnMsIGJ1dCBzdGltdWxpIGRvIG5vdCEpLiAgLS0+Cgo8IS0tIC0tIFdoYXQga2luZCBvZiBzbG9wZSB0ZXJtcyBhcmUgbmVlZGVkPyAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIG0gPC0gbG1lcihzaW1fZnJhY0xlc3NFeHBlY3RlZCAgfiAxICsgKDF8c2hvcnRJZCkgKyAoMXxzdGltdWxpKSwgZGF0YSA9IHNpbXVsYXRlZF8xMnNlc3Npb25fZGF0YSkgIyBMTUUgbW9kZWwsIGdyb3VwaW5nIGJ5IHBhcnRpY2lwYW50ICogc3RpbXVsaSAtLT4KPCEtLSAjIHN1bW1hcnkobSkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gKiBLZXkgbW9kZWxpbmcgcXVlc3Rpb246IE1vZGVsIEdyYXZpdHksIFN1cHBvcnQsIGFuZCBDb250cm9sIGluIDEgbW9kZWwsIG9yIHNwbGl0IHVwPyAgLS0+Cgo8IS0tIFdlIGFyZSBsZXNzIGludGVyZXN0ZWQgaW4gKmRpZmZlcmVuY2VzIGFtb25nIHRoZXNlKiB0aGFuIGluICAqY2hhcmFjdGVyaXppbmcgdGhlIHRyYWplY3Rvcnkgb2YqIGVhY2guIFNvLCB1bHRpbWF0ZWx5IGV4cGVjdCB0byBtb2RlbCBzZXBhcmF0ZWx5PyBCdXQgZm9yIG5vdywga2VlcCB0aGVtIHRvZ2V0aGVyIHRvIHdyaXRlIHRoZSAnYmFzZWxpbmUnIG1vZGVsLiAgLS0+Cgo8IS0tIFdpdGhpbiBlYWNoICh3aGljaCBJIHRoaW5rIHdlIFdJTEwgd2FudCB0byBrZWVwIHRvZ2V0aGVyKSwgdGhlcmUgYXJlIChkaWZmZXJlbnRseSkgbmVzdGVkIHN1Yi1jb25jZXB0cywgYW5kIHRoZW4gY3Jvc3MtY3V0dGluZyBjb21wYXJpc29ucyB0aGF0IHRlc3QgdGhvc2UgY29uY2VwdHMuICBBcyBmb2xsb3dzOiAtLT4KCjwhLS0gQ29uY2VwdCA+IEV2ZW50ID4gY29tcGFyaXNvbiAtLT4KCjwhLS0gTkEgPiBjYWxpYnJhdGlvbiA+IE5BIChuZWVkIHRvIGNoYXJhY3Rlcml6ZSBmdXJ0aGVyKSAtLT4KCjwhLS0gQ29udHJvbCA+IFNhbGllbmNlID4gYm9yaW5nOmludGVyZXN0aW5nIC0tPgoKPCEtLSBDb250cm9sID4gU2FtZSA+IEE6QiAtLT4KCjwhLS0gR3Jhdml0eSA+IFJhbXAgPiBkb3duOnVwIC0tPgoKPCEtLSBHcmF2aXR5ID4gVG9zcyA+IGRvd246dXAgKFRoaXMgSVMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyBmb3IgUmFtcCkgLS0+Cgo8IS0tIFN1cHBvcnQgPiBTdGF5ID4gIm1vc3RseS1vbjpuZXh0LXRvIiwibmVhcjpzbGlnaHRseS1vbiIsIm1vc3RseS1vbjpuZWFyIiwibW9zdGx5LW9uOnNsaWdodGx5LW9uIiwgIm5lYXI6bmV4dC10byIgICAgICAgLS0+Cgo8IS0tIFN1cHBvcnQgPiBGYWxsID4gIm1vc3RseS1vbjpuZXh0LXRvIiwibmVhcjpzbGlnaHRseS1vbiIsIm1vc3RseS1vbjpuZWFyIiwibW9zdGx5LW9uOnNsaWdodGx5LW9uIiwgIm5lYXI6bmV4dC10byIgKFRoZXNlIGxldmVscyBBUkUgZXF1aXZhbGVudCB0byB0aG9zZSBpbiBTdGF5ISkgLS0+Cgo8IS0tIEZvciBub3csIGtlZXAgYWxsIHRvZ2V0aGVyLiBUaGlzIG1heSBiZWNvbWUgaW50cmFjdGFibGUhIC0tPgoKPCEtLSAqIEV4cGVjdCB0aGF0IGF0dGVudGlvbiB0byBmcmFjTGVzc0V4cGVjdGVkIG1heSB2YXJ5IGZvciBlYWNoICpldmVudCB0eXBlKiwgd2hpY2ggYXJlIG5lc3RlZCB3aXRoaW4gKmNvbmNlcHQgdHlwZXMqLiAgRS5nLiBSYW1wIGFuZCBGYWxsIGV2ZW50cyBhcmUgYm90aCB3aXRoaW4gdGhlIGdyYXZpdHkgKmNvbmNlcHQqLiAgUmFtcCBhbmQgRmFsbCBhcmUgKm5vdCByYW5kb20qIChpLmUuIHdlIGRvbid0IG5lY2Vzc2FyaWx5IHJlcXVpcmUgYWJpbGl0eSB0byBnZW5lcmFsaXplIHRvIGFsbCBwb3NzaWJsZSAnZ3Jhdml0eSB0ZXN0cyc/KSwgYnV0IHRoZXkgKmFyZSByZWxhdGVkKi4gICBUaGF0IGlzLCBJIHRoaW5rIHRoYXQgY29uY2VwdHVhbGx5IHRoZSBmb2xsb3dpbmcgaXMgd3JvbmcgKGFuZCB0aGUgZ2xtZXIgcGFja2FnZSBoYXRlcyBpdCksIGJ1dCBub3Qgc3VyZSBob3cgdG8gbW9kaWZ5LiAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjbSA8LSBsbWVyKHNpbV9mcmFjTGVzc0V4cGVjdGVkICB+IGV2ZW50ICsgY29uY2VwdCArIGNvbXBhcmlzb24gKyAoMXxzaG9ydElkKSArICgxfHN0aW11bGkpLCBkYXRhID0gc2ltdWxhdGVkXzEyc2Vzc2lvbl9kYXRhKSAjIExNRSBtb2RlbCwgZ3JvdXBpbmcgYnkgcGFydGljaXBhbnQgKiBzdGltdWxpIC0tPgo8IS0tICNzdW1tYXJ5KG0pIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gKiBFeHBlY3QgZnJhY3Rpb25zIHRvIGxlc3NFeHBlY3RlZCB0byBjaGFuZ2UgYXMgY2hpbGRyZW4gZ2V0IG9sZGVyLCBhbmQsIGluZGVwZWRlbnRseSAoPz8/KSwgYXMgdGhleSBoYXZlIHNlZW4gbW9yZSBzZXNzaW9ucy4gRXhwZWN0IHRoYXQgYm90aCBhZ2UgYW5kIHNlc3Npb24gdGVybXMgaW50ZXJhY3Qgd2l0aCB0cmlhbCBudW1iZXIgKHN0dWZmIGdldHMgbW9yZSBib3JpbmcgYXMgeW91IGdvIGFsb25nKS4gLS0+Cgo8IS0tIENvbmNlcHR1YWwgcG9pbnQ6ICpIb3cqIGRvIHdlIGV4cGVjdCB0aGVtIHRvIGNoYW5nZT8gTGluZWFybHk/IE1heWJlIG5vdC4gSW4gdGhpcyBraW5kIG9mIHN0dWR5LCBpbmZhbnRzIHNlZW0gdG8gaGF2ZSAnc3dlZXQgc3BvdHMnIHdpdGggc29tZSBraW5kIG9mIHN0aW11bGksIHdoZXJlIHRoZXkgaW5pdGlhbGx5IGF2b2lkIGEgbm92ZWwvY29tcGxleCBzdGltdWx1cywgdGhlbiB0dW5lIGludG8gaXQuIChCdXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uKSAgUXVhZHJhdGljIHNsb3BlcyBieSBjb25jZXB0PyAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjbSA8LSBsbWVyKHNpbV9mcmFjTGVzc0V4cGVjdGVkICB+IGV2ZW50ICsgY29uY2VwdCArIGNvbXBhcmlzb24gKyBzZXNzaW9uKnRyaWFsbnVtICsgc2ltX2FnZSp0cmlhbG51bSArICgxIHwgc2hvcnRJZCkgKyAoMXxzdGltdWxpKSwgZGF0YSA9IHNpbXVsYXRlZF8xMnNlc3Npb25fZGF0YSkgIC0tPgo8IS0tICNzdW1tYXJ5KG0pIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gKiAuLi4uIE9rYXksIHByZXRlbmQgd2Ugc2V0dGxlZCBvbiB0aGUgYmFzZSBtb2RlbCEgV2hhdCB3ZSByZWFsbHkgd2FudCB0byBrbm93IGlzIHdoZXRoZXIga2lkcyBoYXZlICdpbnRlcmVzdGluZycgZnJhY0xlc3NFeHBlY3RlZCB2YWx1ZXMgKGllIGRpZmZlcmVudCBmcm9tIDUwJSBpbiBlaXRoZXIgZGlyZWN0aW9uLCB3aXRoIHNvbWUgY29uc3RyYWludHMgb24gdGhlIGRldmVsb3BtZW50YWwgdHJhamVjdG9yeSksIGFuZCBpZiBzbywgaWYgdGhlaXIgdHJhamVjdG9yaWVzIGRpZmZlciBmcm9tIG9uZSBhbm90aGVyIGZvciBkaWZmZXJlbnQgY29uY2VwdHMuICBJbiBwYXJ0aWN1bGFyLCB3ZSB3b3VsZCBsaWtlIHRvIGVzdGltYXRlICp3aGVuKiB0aGUgZm9sbG93aW5nIGNvbmNlcHRzIGRlcGFydCBmcm9tIGNoYW5jZSwgYW5kICppZiogdGhvc2UgZXN0aW1hdGVzIGRpZmZlciBmcm9tIG9uZSBhbm90aGVyLiBJZGVhbGx5LCB3ZSdkIGJlIGFibGUgdG8gc2F5IHNvbWV0aGluZyBhYm91dCB3aGV0aGVyIGl0J3MgdGhlIGNhc2UgdGhhdCBpbmRpdmlkdWFsIGNoaWxkcmVuICdhcXVpcmUgY29uY2VwdHMnIGluIGEgcHJlZGljdGFibGUgb3JkZXIuICAtLT4KCjwhLS0gQ29udHJvbDogU2FsaWVuY2UgdnMuIFNhbWUgKGV4cGVjdCBTYW1lIHRvIHN0YXkgYXQgNTAlISwgYnkgaHlwb3RoZXNpcy9jb25zdHJ1Y3Rpb24gb2Ygc3RpbSB0aGVyZSBpcyBubyBjb25zaXN0ZW50IGRpZmZlcmVuY2UhKSAtLT4KPCEtLSBHcmF2aXR5IHZzLiBTdXBwb3J0PyAtLT4KPCEtLSBHcmF2aXR5IC0tPgo8IS0tIEdyYXZpdHkgdnMuIFNhbWU/ICgnU2FtZScgY29uc3RpdHV0ZXMgYW4gZXhwZWN0ZWQgYmFzZWxpbmUuIFNob3VsZCBpdCBiZSBhIGNvbXBhcmlzb24gZm9yIGFsbCBvdGhlciBxdWVzdGlvbnM/KSAtLT4KPCEtLSBHcmF2aXR5OiBSYW1wIHZzLiBUb3NzIC0tPgo8IS0tIFN1cHBvcnQ6IEFjcm9zcyBzdGF5L2ZhbGwgLS0+CjwhLS0gU3VwcG9ydDogU3RheSB2cy4gRmFsbCAoYWNyb3NzIGNvbXBhcmlzb25zLCBidXQgZXhwZWN0YXRpb25zIGFyZSBvcHBvc2l0ZSkgLS0+CjwhLS0gU3VwcG9ydDogIm1vc3RseS1vbjpuZXh0LXRvIiwibmVhcjpzbGlnaHRseS1vbiIsIm1vc3RseS1vbjpuZWFyIiwibW9zdGx5LW9uOnNsaWdodGx5LW9uIiwgIm5lYXI6bmV4dC10byIgLS0+Cgo8IS0tIEZvciB0aGlzIG9uZSwgd2UgaGF2ZSBzb21lIGh5cG90aGVzaXMtZHJpdmVuIHByZWRpY3Rpb25zIGFib3V0IG9yZGVyLiAtLT4KCjwhLS0gKFRIRVNFIEFSRSBIQVJEIFRPIFNQRUNJRlkhKSAtLT4KCjwhLS0gSW4gc3BhY2U6IG1vc3RseS1vbiBzbGlnaHRseS1vbiBuZXh0LXRvIG5lYXIgLS0+Cgo8IS0tIEVhc2llc3Q6IG1vc3RseS1vbjpuZWFyIC0tPgo8IS0tIEhhcmRlcjogIC0tPgo8IS0tIEhhcmRlc3Q6ICJuZWFyOm5leHQtdG8iIC0tPgo8IS0tICJtb3N0bHktb246bmV4dC10byIsIm5lYXI6c2xpZ2h0bHktb24iLCJtb3N0bHktb246c2xpZ2h0bHktb24iLCAgLS0+Cgo8IS0tIEZvciBlYXNlIG9mIHZpc3VhbGl6YXRpb24sIHdlJ2xsIGJlIHBsb3R0aW5nIGBmcmFjTGVzc0V4cGVjdGVkYDogcGVyY2VudGFnZSBvZiB0aW1lIHNwZW50IGxvb2tpbmcgYXQgd2hpY2ggZXZlciB2aWRlbyBpcyBtb3N0IHN1cnByaXNpbmcuIEhlcmUgaXMgYSBib3ggcGxvdCBvZiBsb29rcyB0byB0aGVzZSBsZXNzIGV4cGVjdGVkIHRoaW5ncyBieSBjb25jZXB0LiAgLS0+Cgo8IS0tIGBgYHtyLCBlY2hvID0gRkFMU0V9IC0tPgoKPCEtLSBjb25jZXB0X21lYW5zX3Blcl9jaGlsZF9wZXJfc2Vzc2lvbiA8LSBwaWxvdGRhdGEgJT4lIC0tPgo8IS0tICAgZmlsdGVyKCFpcy5uYShmcmFjTGVzc0V4cGVjdGVkKSklPiUgLS0+CjwhLS0gICBncm91cF9ieShzaG9ydElkLCBjb25jZXB0KSAlPiUgLS0+CjwhLS0gICBzdW1tYXJpc2UoZkxFID0gbWVhbihmcmFjTGVzc0V4cGVjdGVkKSwgYWdlID0gZmlyc3QoYWdlUmVnaXN0cmF0aW9uKSkgLS0+Cgo8IS0tIGcgPC0gZ2dwbG90KGNvbmNlcHRfbWVhbnNfcGVyX2NoaWxkX3Blcl9zZXNzaW9uLCBhZXMoeSA9IGZMRSwgeCA9IGNvbmNlcHQpKSArIC0tPgo8IS0tICAgZ2VvbV9ib3hwbG90KCkgKyAtLT4KPCEtLSAgIGdlb21faml0dGVyKGFscGhhID0gMC4xKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNSwgbGluZXR5cGUgPSAnZGFzaGVkJykrIC0tPgo8IS0tICAgZ2d0aXRsZSgnTWVhbnMgcGVyIGNoaWxkLCBwZXIgY29uY2VwdCcpICsgLS0+CjwhLS0gICB5bGFiKCdGcmFjdGlvbiBsb29raW5nIHRpbWUgdG93YXJkIGxlc3MgZXhwZWN0ZWQgKGZMRSknKSsgLS0+CjwhLS0gICB4bGFiKCdDb25jZXB0JykgLS0+CjwhLS0gcHJpbnQoZykgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSBBbmQgdGhlIHNhbWUsIG9yZ2FuaXplZCBieSBhZ2UuIC0tPgo8IS0tIGBgYHtyLCBlY2hvID0gRkFMU0V9IC0tPgoKPCEtLSBjb25jZXB0c19tZWFuc19ieV9hZ2UgPC0gcGlsb3RkYXRhICU+JSAtLT4KPCEtLSAgIGZpbHRlcighaXMubmEoZnJhY0xlc3NFeHBlY3RlZCkpJT4lIC0tPgo8IS0tICAgZ3JvdXBfYnkoc2hvcnRJZCwgY29uY2VwdCkgJT4lIC0tPgo8IS0tICAgc3VtbWFyaXNlKGZMRSA9IG1lYW4oZnJhY0xlc3NFeHBlY3RlZCksIGFnZSA9IGZpcnN0KGFnZVJlZ2lzdHJhdGlvbikpIC0tPgoKPCEtLSBnIDwtIGdncGxvdChjb25jZXB0c19tZWFuc19ieV9hZ2UsIGFlcyh5ID0gZkxFLCB4ID0gYWdlKSkgKyAtLT4KPCEtLSAgIGdlb21faml0dGVyKGFscGhhID0gMC4xKSArIC0tPgo8IS0tICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNSwgbGluZXR5cGUgPSAnZGFzaGVkJykrIC0tPgo8IS0tICAgZmFjZXRfd3JhcCh+Y29uY2VwdCkrIC0tPgo8IS0tICAgeWxhYignRnJhY3Rpb24gbG9va2luZyB0aW1lIHRvd2FyZCBsZXNzIGV4cGVjdGVkIChmTEUpJykrIC0tPgo8IS0tICAgeGxhYignQWdlIGluIG1vbnRocycpIC0tPgo8IS0tIHByaW50KGcpIC0tPgo8IS0tIGBgYCAtLT4KCgoKCjwhLS0gIyMgVGhlIHByb2JsZW0gLS0+Cgo8IS0tIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBwcmVyZWdpc3RyYXRpb24sIHdlIGFzc3VtZSB0aGF0IGJhYmllcyBiZWdpbiBieSBub3QgbG9va2luZyBhbnl3aGVyZSBpbiBwYXJ0aWN1bGFyLCBhbmQgdGhlbiBiZWdpbiBsb29raW5nIGxvbmdlciBhdCBzdXJwcmlzaW5nIHRoaW5ncyAocG90ZW50aWFsbHkgYXQgZGlmZmVyZW50IHBvaW50cyBmb3IgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgdGhpbmdzKS4gKlRoaXMgaXMgYSBtYWpvciBzaW1wbGlmeWluZyBhc3N1bXB0aW9uKiBhbmQgbWF5IHR1cm4gb3V0IHRvIGJlIGZsYXRseSB3cm9uZyBpbiBvdXIgZGF0YXNldC4gU2VlIG1vZGVsaW5nIHNlY3Rpb24gZm9yIGRldGFpbHMuICAtLT4KCjwhLS0gVGhlcmUgaXMgYW4gdW5jb21mb3J0YWJsZSBmYWN0IHRoYXQgd2UgZXhwZWN0IHRoYXQgYmFiaWVzIG1heSBhY3R1YWxseSBsb29rIGxvbmdlciBhdCAqZWl0aGVyKiB0aGUgbGVzcy1zdXJwaXNpbmcgb3IgbW9yZS1zdXJwcmlzaW5nIGV2ZW50LCBpZiB0aGV5IGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlLiBUaGF0IGlzLCB1bmVxdWFsIGF0dGVudGlvbiBpbiBlaXRoZXIgZGlyZWN0aW9uIGlzIGludGVycHJldGVkIGFzICdrbm93aW5nIHRoZSBjb25jZXB0Jywgd2hpbGUgZXF1YWwgYXR0ZW50aW9uIChlLmcuIHRyZWF0aW5nIHRoZSBjb21wYXJpc29uIG9mIGJhbGwgdG9zc2luZyB1cC9kb3duIHRoZSBzYW1lIGFzIHRoZSBjb21wYXJpc29uIG9mIG9hdG1lYWwtc3RpcnJpbmcgdG8gb2F0bWVhbC1zdGlycmluZykgaXMgaW50ZXJwcmV0ZWQgdG8gbWVhbiBubyBldmlkZW5jZSBmb3Iga25vd2luZyB0aGF0IGNvbmNlcHQuICAtLT4KCjwhLS0gRk9SVFVOQVRFTFksIHRoaXMgaXMgY29uc3RyYWluZWQ6IGEgc3RhbmRhcmQgbW9kZWwgaXMgdGhhdCB3ZSBleHBlY3QgYmFiaWVzIHRvIGluaXRpYWxseSBsb29rIHRvd2FyZCB0aGUgbW9yZSBmYW1pbGlhciB0aGluZyAoYmVjYXVzZSB0aGUgbm92ZWwgb25lIGlzIHRvbyBjb25mdXNpbmcpLCBhbmQgdGhlbiBzaGlmdCB0b3dhcmQgbG9va2luZyBhdCB0aGUgc3VycHJpc2luZyB0aGluZyAod2hpY2ggdGhleSBjYW4gbGVhcm4gZnJvbS9mYW1pbGlhciBvbmUgaXMgdG9vIGJvcmluZy4pICBRdWFsaXRhdGl2ZWx5LCBpdCBsb29rcyBsaWtlIHRoaXMgKGZyb20gSHVudGVyICYgQW1lcyAxOTg4KTogLS0+Cgo8IS0tIGBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJIdW50ZXIgJiBBbWVzICgxOTg4KSBjdXJ2ZSIsIG91dC53aWR0aCA9ICcxMDAlJ30gLS0+CjwhLS0gI2tuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImFuYWx5c2lzL2ZpZ3MvaHVudGVyLWFtZXMucG5nIikpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMgVGhlIHNvbHV0aW9uIChmb3Igbm93KSAtLT4KCjwhLS0gRGVzcGl0ZSB0aGUgYWJvdmUsIGluIHRoZSByZWFsbSBvZiBwaHlzaWNhbCBldmVudHMgc3BlY2lmaWNhbGx5LCBtb3N0IHN0dWRpZXMgaGF2ZSBzaG93biBpbmZhbnRzIHRvIGxvb2sgbG9uZ2VyIGF0IHRoZSBzdXJwcmlzaW5nIHRoaW5nICh0aG91Z2ggbm90ZSB0aGF0IHRoZXkgaGF2ZSB1c2VkIHNpbmdsZS1pdGVtIHByZXNlbnRhdGlvbiByYXRoZXIgdGhhbiB0d28tc2NyZWVuIGNvbXBhcmlzb25zIGFzIHdlIGRvIGhlcmUuKSBUaGlzIHN1Z2dlc3RzIHR3byBwb3NzaWJsZSBzb2x1dGlvbnMgZm9yIG1vZGVsaW5nICdsZWFybmluZyBjdXJ2ZXMnOiAtLT4KCjwhLS0gLSBNb2RlbCBsaW5lYXJseTogQWR2YW50YWdlICAtLT4KCg==